Python rtype docstring/реструктурированный текст для фабрик классов/селекторов
: rtype: указывает, что это тип возвращаемого объекта
Поэтому, когда я создаю объект obj
в следующем фрагменте, я получаю предупреждение от IDE, что cls is not callable
, так как IDE ожидает, что cls
есть object
типа SomeAbstractClass
, и я хочу SomeAbstractClass
сам
IDE прав, поскольку это поведение по умолчанию. Но как я могу указать, что я возвращаю класс, а не экземпляр класса?
Указание type
вместо SomeAbstractClass
помогает немного, но не решение, поскольку не существует дополнительной интроспекции.
def class_selector(data):
"""
:rtype: SomeAbstractClass
:return: Return some class based on given parameters
"""
return get_from.get(data.name)
cls = class_selector(data)
obj = cls(data.more_data)
Тем временем я решаю это, добавляя """:type: SomeAbstractClass"""
после создания объекта, но это не отменяет предупреждение и это грязное решение.
Btw, говоря о python 2.x
Ответы
Ответ 1
если данные являются экземплярами SomeAbstractClass, вы можете использовать следующие фрагменты:
пример 1:
def class_selector(data):
"""
return: Return the class of data
"""
return type(data)
Пример 2:
def class_selector(data):
"""
return: Return the class of data.
"""
return data.__class__
И если вы хотите использовать data.name для указания класса, вы можете использовать это:
def class_selector(data):
"""
return: Return a class specified by data.name
"""
return type(globals()[data.name]) #or use globals()[data.name].__class__
и вы должны поймать исключение KeyError, когда используете этот