2015-12-21 74 views
0

在Python中,是否有相當於在包的模塊上做getattr()?換句話說,是否有一種方法可以在下面的包中搜索一個函數?Getattr在Python中的封裝

Intents/ 
|-- __init__.py 
|-- foo.py 
|-- bar.py 
|-- baz.py 
+0

這樣做將需要進口的所有模塊的封裝。這可以接受嗎? – martineau

+0

這是可以接受的,他們都會很小。 –

回答

1

您可以使用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... exceptgetattr找到哪個模塊包含所需的類或函數(您也可以導入任何其他頂級對象)

0

如果找到函數,您並沒有真正說出您想要返回的內容,因此以下內容僅返回模塊名稱。

如果添加下列函數定義你的__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 
+0

這不是回答你的問題嗎? – martineau