осматривать.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 thenmathe
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 (), который можно использовать, но это не совсем так аккуратно.
2 ответа:
C-определенные функции не являются экземплярами пользовательского типа
function
; они определены в C, для которых вы могли бы Использоватьinspect.isbuiltin()
.Самый надежный способ перечислить все функции в модулях-использовать
inspect.isroutine()
вместо этого:Возвращает 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()
возвращает true, если один изinspect.isbuiltin()
,inspect.isfunction()
,inspect.ismethod()
илиinspect.ismethoddescriptor()
возвращает True.
Вы читали документацию для
isfunction
(курсив добавлен):Возвращает true, если объект является функцией Python
Так что нет, это не работает для встроенных функций.
Вместо этого вы можете использовать
inspect.isroutine
для вашего теста. Это все равно будет пропускать объекты, которые определяют__call__
, которые могут быть или не быть тем, что вы хотите. Вы также можете использоватьcallable
для вашего теста, который также может быть или не быть тем, что вы хотите. Это не всегда простая задача, чтобы знать, какой вид объекты, которые вы хотите рассматривать как "функции", поскольку могут существовать объекты, которые должны действовать как функции, но на самом деле не являются функциями.