Форум сайта python.su
33
Всем привет
Хочу уточнить по поводу inspect.ismethod()
Эта функция выводит True, только для методов, которые описаны в классах ?
Например
import inspect class Test(object): def test(self): pass l = [123] print inspect.ismethod(Test.test), type(Test.test) print inspect.ismethod(l.append), type(l.append)
Отредактировано Budulianin (Июнь 23, 2013 23:21:52)
Офлайн
33
lorienЯ имел в виду классы, которые сам описал. Мне непонятно, почему у
А какие ещё методы бывают?
Отредактировано Budulianin (Июнь 24, 2013 00:09:59)
Офлайн
15
Начал было писать своими словами, но написал некорректно. Потому просто предлагаю посмотреть в реализацию метода inspect.ismethod():
import inspect #отсюда видно, что это лишь обёртка для встроенной функции isinstance() def ismethod(object): """Return true if the object is an instance method. Instance method objects provide these attributes: __doc__ documentation string __name__ name with which this method was defined __func__ function object containing implementation of method __self__ instance to which this method is bound""" return isinstance(object, types.MethodType) # но что такое types.MethodType ? смотрим в модуль types: class _C: def _m(self): pass MethodType = type(_C()._m) # странно то, что для выражения inspect.ismethod(l.append) возвращается False! смотрим дальше: l = [1, 2, 3] print(type(l.append)) # <class 'builtin_function_or_method'> # смотрим в модуль types: BuiltinFunctionType = type(len) BuiltinMethodType = type([].append) # Same as BuiltinFunctionType # смотрим в модуль inspect, какой же метод работает с этими типами: def isbuiltin(object): """Return true if the object is a built-in function or method. Built-in functions and methods provide these attributes: __doc__ documentation string __name__ original name of this function or method __self__ instance to which a method is bound, or None""" return isinstance(object, types.BuiltinFunctionType) # пробуем: print(inspect.isbuiltin(l.append)) # True
Отредактировано buddha (Июнь 24, 2013 08:46:56)
Офлайн
20
Офлайн
33
buddha, спасибо за столь развёрнутый ответ, теперь понятно
Непонятно только почему в Python у type(len) и type(.append) один тип
Получается, нельзя различить тип len от типа .append, или всё таки, как-то можно ?
Отредактировано Budulianin (Июнь 25, 2013 21:20:43)
Офлайн
15
На этот счёт идей нету. Т.к. и функция и метод встроенные, я б не парился на этот счёт.
>>> import types >>> isinstance(len, types.BuiltinFunctionType) True >>> isinstance(len, types.BuiltinMethodType) True >>> isinstance([].append, types.BuiltinMethodType) True >>> isinstance([].append, types.BuiltinFunctionType) True
Офлайн
88
А в документации всё четко написано:
inspect.ismethod(object)
Return true if the object is a bound method written in Python.
Офлайн
33
Shaman
А в документации всё четко написано:inspect.ismethod(object) Return true if the object is a bound method written in Python.
class A: def func(self): pass >>> A.func <unbound method A.func> >>> a = A() >>> a.func <bound method ...> >>>inspect.ismethod(A.func) True >>>inspect.ismethod(a.func) True
Офлайн
88
BudulianinВот в чем
И в чём прикол?
def ismethod(object): """Return true if the object is an instance method. Instance method objects provide these attributes: __doc__ documentation string __name__ name with which this method was defined im_class class object in which this method belongs im_func function object containing implementation of method im_self instance to which this method is bound, or None""" return isinstance(object, types.MethodType)
UnboundMethodType = type(_C._m) # Same as MethodType _x = _C() MethodType = type(_x._m)
types.MethodTypeВ документации видимо не отражены текущие изменения, но я ударение делал на “писанные на Питоне”.
The type of methods of user-defined class instances.
types.UnboundMethodType
An alternate name for MethodType.
Отредактировано Shaman (Июнь 27, 2013 11:19:43)
Офлайн