Как импортировать метод-обертку типа? - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть библиотека module-wrapper , которая рекурсивно оборачивает объекты. Я хочу определить, имеет ли объект функциональный тип. Я могу проверить почти все функциональные объекты, используя:

inspect.isbuiltin(object=obj) or
inspect.isfunction(object=obj) or
inspect.ismethod(object=obj) or
inspect.ismethoddescriptor(object=obj)

Проблема в том, что некоторые связанные методы не обнаруживаются в этом коде, например:

s = "Hello, world!"
type(s.__add__)
# method-wrapper

Полагаю, я не могу проверить объекты на method-wrapper с помощью модуля inspect. Но как мне импортировать этот тип? Я не нашел его.

Теперь у меня ужасный хак в моем коде:

MethodWrapper = type(''.__add__)
isinstance(obj, MethodWrapper)

UPD0:

Я не хочу использовать callable, потому что он обнаруживает классы и объекты, которые реализуют __call__, но я хочу, чтобы эти классы и объекты обрабатывались отдельно.

1 Ответ

0 голосов
/ 03 ноября 2018

Модуль types предоставляет имена для многих типов «реализации», включая несколько для функций, реализованных в C. Конкретный пример type("".__str__), MethodWrapperType, был только что добавлен в CPython 3.7.

Поскольку эта область тонкая и количество типов велико, callable действительно может быть лучшим выбором. Вы можете легко проверить наличие type объектов сначала, чтобы «исключить» классы, и различные эвристики ( например, , try, вызывающие vars для объекта или проверяющие type(x).__module__), могут использоваться для распознавать типичные «вызываемые объекты» (не то, что они принципиально отличаются от встроенных типов функций).

...