Какой тип в модуле ввода описывает класс? Какой тип описывает функцию?

Новый модуль 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

person Hammerite    schedule 24.12.2015    source источник


Ответы (1)


Классы являются экземплярами типа type.

Функции имеют типы types.FunctionType или types.BuiltinFunctionType.

Методы имеют типы types.MethodType или types.BuiltinMethodType.

types был частью Python... очень долгое время.

person Ignacio Vazquez-Abrams    schedule 25.12.2015
comment
Да, это не ново. И он был распотрошен в 3.5. Чистота побеждает практичность — девиз 3.x - person Jürgen A. Erhard; 19.02.2017
comment
@JürgenA.Erhard types был не исправлен в Python 3.5. Без понятия, откуда ты это взял. - person erb; 09.06.2017
comment
Из сравнения типов в 2.7 и 3.5? Хотелось бы, чтобы на все вопросы было так легко ответить. - person Jürgen A. Erhard; 09.06.2017
comment
@ JürgenA.Erhard: types был очищен в 3.0, в основном удалено большое количество устаревших имен. Например, types.IntType устарело, так как int было изменено с фабричной функции на имя фактического типа int. Другие удаленные имена соответствуют типам, которых больше не существует. Насколько я помню, единственное удаленное имя, которое не соответствует этому шаблону, — это types.NoneType, но вы можете просто использовать для этого type(None). - person user2357112 supports Monica; 10.09.2018