Новый модуль typing
в Python 3.5 предоставляет ряд инструментов для использования в аннотациях типов. Предоставляет ли он объект или тип, который инкапсулирует идею класса? Как насчет идеи функции?
В следующем коде, который определяет декоратор, что должно стоять за class_
? Что должно стоять вместо function
? (typing.Callable
не подходит, потому что, например, класс вызывается, но код пытается идентифицировать методы.) (Декоратор no_type_check()
в самом модуле typing
может быть прототипом декораторов, которые действуют подобным образом. Сам no_type_check()
не имеет никаких аннотаций. , тип-подсказка или что-то другое.)
import typing
def is_double_underscore_name (name):
return len(name) > 4 and name.startswith('__') and name.endswith('__')
# This code will not run, because 'class_' and 'function' are names that do not have any
# predefined meaning. See the text of the question.
# Note: This modifies classes in-place but (probably) does not modify functions in-place;
# this is not a considered design decision; it is just the easiest thing to do in a very
# basic example like this.
def do_something (class_or_function: typing.Union[class_, function]):
if isinstance(class_or_function, class_):
for name in class_or_function.__dict__:
if not is_double_underscore_name(name):
object = class_or_function.__dict__[name]
if isinstance(object, function):
class_or_function.__dict__[name] = do_something(object)
return class_or_function
else:
... # return the function, modified in some way