inspect.isfunction работает не для всех модулей?

Я пытаюсь использовать ответ на вопрос Возможно ли чтобы перечислить все функции в модуле?, чтобы перечислить функции в диапазоне модулей. Но в моем интерпретаторе я получаю следующее:

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (In
tel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import inspect
>>> import math
>>> math.pow(5,4)
625.0
>>> inspect.getmembers(math, inspect.isfunction)
[]
>>> inspect.getmembers(inspect, inspect.isfunction)
[('_check_class', <function _check_class at 0x00C9F9C0>), ('_check_instance', <f
unction _check_instance at 0x00C9F978>), ('_get_user_defined_method', <function
_get_user_defined_method at 0x00C9FB70>), ('_getfullargs', <function _getfullarg
s at 0x00C6A4F8>), ('_is_type', <function _is_type at 0x00C9FA08>), ('_missing_a
rguments', <function _missing_arguments at 0x00C9F198>), ('_shadowed_dict', <fun
ction _shadowed_dict at 0x00C9FA50>)... foo, bar, etc]

>>> math
<module 'math' (built-in)>
>>> inspect
<module 'inspect' from 'E:\\Python33\\lib\\inspect.py'>

>>> import win32api
>>> inspect.getmembers(win32api, inspect.isfunction)
[]
>>> win32api
<module 'win32api' from 'E:\\Python33\\lib\\site-packages\\win32\\win32api.pyd'>

Как обычно, я предполагаю, что есть какая-то совершенно очевидная причина того, почему не перечисляются все функции в половине модулей, которые я пробую. Лучшее, что я могу догадаться, это isfunction () работает только для модулей .py? Если есть врожденная проблема, не связанная с моей глупостью, есть ли способ исправить это?

Это явно проблема с isfunction (), поскольку getmembers, похоже, работает нормально:

>>> import math
>>> import inspect
>>> inspect.getmembers(math)
[('__doc__', 'This module is always available.  It provides access to the\nmathe
matical functions defined by the C standard.'), ('__loader__', <class '_frozen_i
mportlib.BuiltinImporter'>), ('__name__', 'math'), ('__package__', ''), ('acos',
 <built-in function acos>), ('acosh', <built-in function acosh>), ('asin', <buil
t-in function asin>)... foo, bar, etc]

Я понимаю, что можно использовать dir (), но на самом деле это не так аккуратно.


person user2979044    schedule 15.03.2014    source источник


Ответы (2)


C-определенные функции не являются экземплярами определяемого пользователем типа function; вместо этого они определены в C, для чего вы можете использовать inspect.isbuiltin().

Надежный способ перечислить все функции в модулях - использовать _3 _ вместо этого:

Верните true, если объект является определяемой пользователем или встроенной функцией или методом.

Демонстрация модуля math:

>>> import inspect
>>> import math
>>> inspect.getmembers(math, inspect.isroutine)
[('acos', <built-in function acos>), ('acosh', <built-in function acosh>), ('asin', <built-in function asin>), ('asinh', <built-in function asinh>), ('atan', <built-in function atan>), ('atan2', <built-in function atan2>), ('atanh', <built-in function atanh>), ('ceil', <built-in function ceil>), ('copysign', <built-in function copysign>), ('cos', <built-in function cos>), ('cosh', <built-in function cosh>), ('degrees', <built-in function degrees>), ('erf', <built-in function erf>), ('erfc', <built-in function erfc>), ('exp', <built-in function exp>), ('expm1', <built-in function expm1>), ('fabs', <built-in function fabs>), ('factorial', <built-in function factorial>), ('floor', <built-in function floor>), ('fmod', <built-in function fmod>), ('frexp', <built-in function frexp>), ('fsum', <built-in function fsum>), ('gamma', <built-in function gamma>), ('hypot', <built-in function hypot>), ('isinf', <built-in function isinf>), ('isnan', <built-in function isnan>), ('ldexp', <built-in function ldexp>), ('lgamma', <built-in function lgamma>), ('log', <built-in function log>), ('log10', <built-in function log10>), ('log1p', <built-in function log1p>), ('modf', <built-in function modf>), ('pow', <built-in function pow>), ('radians', <built-in function radians>), ('sin', <built-in function sin>), ('sinh', <built-in function sinh>), ('sqrt', <built-in function sqrt>), ('tan', <built-in function tan>), ('tanh', <built-in function tanh>), ('trunc', <built-in function trunc>)]

Обратите внимание на built-in часть строкового представления каждого функционального объекта.

isroutine() возвращает истину, если один из inspect.isbuiltin(), _ 9_, _ 10_ или _ 11_ возвращает True.

person Martijn Pieters    schedule 15.03.2014

Читали ли вы документацию для isfunction (курсив добавлен):

Вернуть true, если объект является функцией Python.

Так что нет, это не работает для встроенных функций.

Вместо этого вы можете использовать inspect.isroutine для своего теста. Это по-прежнему будет пропускать объекты, которые определяют __call__, что может быть или не быть тем, что вы хотите. Вы также можете использовать callable для своего теста, который также может быть, а может и не быть тем, что вы хотите. Не всегда легко узнать, какие объекты вы хотите считать «функциями», поскольку могут быть объекты, которые должны действовать как функции, но на самом деле не являются функциями.

person BrenBarn    schedule 15.03.2014
comment
Я читал документацию, но не знал, что функция Python относится к функциям, написанным на Python. Я просто предположил, что это какая-то излишняя наглядность. - person user2979044; 16.03.2014