在Python中,是否有相當於在包的模塊上做getattr()
?換句話說,是否有一種方法可以在下面的包中搜索一個函數?Getattr在Python中的封裝
Intents/
|-- __init__.py
|-- foo.py
|-- bar.py
|-- baz.py
在Python中,是否有相當於在包的模塊上做getattr()
?換句話說,是否有一種方法可以在下面的包中搜索一個函數?Getattr在Python中的封裝
Intents/
|-- __init__.py
|-- foo.py
|-- bar.py
|-- baz.py
您可以使用getattr
擺脫一個Python模塊的任何對象:
In [4]: cat bla.py
def foo():
pass
In [5]: import bla
In [6]: getattr(bla, 'foo')
Out[6]: <function bla.foo>
所以,你可以走在一個包中的所有模塊,並try... except
與getattr
找到哪個模塊包含所需的類或函數(您也可以導入任何其他頂級對象)
如果找到函數,您並沒有真正說出您想要返回的內容,因此以下內容僅返回模塊名稱。
如果添加下列函數定義你的__init__.py
文件:
def find_func(func_name):
""" Return name of package module that contains named function. """
import os
import sys
import traceback
import types
# dynamically imports all the python modules in sub directory
package_path = os.path.split(__file__)[0]
package_directory = os.path.split(package_path)[1]
for fn in os.listdir(package_directory):
globals_, locals_ = globals(), locals()
# process all python files in directory that don't start with underscore
if fn[0] != '_' and fn.split('.')[-1] in ('py', 'pyw'):
modulename = fn.split('.')[0] # filename without extension
subpackage = ".".join([package_directory, modulename])
try:
module = __import__(subpackage, globals_, locals_, [modulename])
except:
traceback.print_exc(file=sys.stdout)
raise # reraise exception
# see if this module has the named function
obj = getattr(module, func_name, None)
if isinstance(obj, (types.FunctionType, types.LambdaType)):
return modulename
return None # not found
然後,您可以執行下列操作,包客戶:
import Intents
print(Intents.find_func('func_in_bar')) # --> bar
這不是回答你的問題嗎? – martineau
這樣做將需要進口的所有模塊的封裝。這可以接受嗎? – martineau
這是可以接受的,他們都會很小。 –