Пользовательские IDE-совместимые типы stati c в Pyhton - PullRequest
0 голосов
/ 17 апреля 2020

Ради более приятного дизайна и OOP я бы хотел создать пользовательский совместимый с IDE тип stati c. Например, рассмотрим следующий идеализированный класс:

class IntOrIntString(Union[int, str]):

    @staticmethod
    def is_int_string(item):
        try:
            int(item)
            return True
        except:
            return False

    def __instancecheck__(self, instance):
        # I know __instacecheck__ is declared in the metaclass. It's written here for the sake of the argument.
        return isinstance(instance, int) or (isinstance(instance, str) and self.is_int_string(instance))

    @staticmethod
    def as_integer(item):
        return int(item)

Теперь это глупый класс, я знаю, но он служит простым примером. Определение такого класса имеет следующие преимущества:

  1. Позволяет проводить c проверку типов в IDE (например, def parse(s: IntOrIntString): ...).
  2. Допускает тип Dynami c -checking (например, isinstance(item, IntOrIntString)).
  3. Может использоваться для лучшей инкапсуляции связанных с типом функций stati c (например, inetger = IntOrIntString.as_integer(item)).

Однако этот код не запустится, потому что Union[int, str] не может быть разделен на подклассы - я получаю:

TypeError: Невозможно ввести подкласс. Union

Итак, я попытался обойти это создавая этот «тип», ссылаясь на него как на экземпляр Union (который на самом деле). Значение:

IntOrIntString = Union[int, str]
IntOrIntString.as_integer = lambda item: int(item)
...

, но это также не сработало, так как я получаю сообщение об ошибке

AttributeError: у объекта '_Union' нет атрибута 'as_integer'

Есть какие-нибудь мысли о том, как это можно сделать, или, возможно, обоснования того, почему это не может быть достигнуто sh?

Я использую python 3.6, но он не установлен в камне, потому что я могу изменить версию, если это необходимо. Я использую IDE PyCharm.

Спасибо

...