Ради более приятного дизайна и 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)
Теперь это глупый класс, я знаю, но он служит простым примером. Определение такого класса имеет следующие преимущества:
- Позволяет проводить c проверку типов в IDE (например,
def parse(s: IntOrIntString): ...
). - Допускает тип Dynami c -checking (например,
isinstance(item, IntOrIntString)
). - Может использоваться для лучшей инкапсуляции связанных с типом функций 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.
Спасибо