2012-01-18 147 views
1

我的Python項目具有以下文件結構:檢查變量

/main.py 
/functions 
/functions/func1.py 
/functions/func2.py 
/functions/func3.py 
/funcitons/__init__.py 

每個func.py文件有一個變量「CAN_USE」。在某些文件中,其他文件是錯誤的。 如何檢查我的main.py文件中哪些func.py文件具有'CAN_USE'變量等於true?

+1

什麼決定了這個'CAN_USE'的價值?你可能想用'__all__'代替。 – 2012-01-18 18:35:19

+0

現在CAN_USE由func.py的開發者決定。如果爲false,那麼使用該函數的客戶端將不會看到這個func.py.而關於\ _ \ _ all \ _ \ _ - 我想只有當我知道函數的名字時纔有效。我希望它更動態,至少在客戶端模塊中 - 比如我的例子中的main.py。因此,main.py中沒有func.py的名字,只是包名'functions'。從我的角度來看,這是更好的做法。糾正我,如果我錯了。 – sunprophit 2012-01-19 00:49:42

回答

3

試試這個使用pkgutil你可以找到包中的所有模塊:

import pkgutil 

def usable_modules(package_name): 
    modules = pkgutil.iter_modules([package_name]) 
    usable = [] 
    for importer, name, ispkg in modules: 
     module = pkgutil.find_loader('{0}.{1}'.format(package_name, name)).\ 
                  load_module(name) 
     if hasattr(module, 'CAN_USE') and module.CAN_USE: 
      usable.append(module) 
    return usable 

print(usable_modules('functions')) 

注意,這也將檢查你的包(例如__init__.py)等模塊。如果您願意,可以在循環中過濾它們(例如if not name.startswith('func'): continue)。

+0

它看起來像我在所有的萬維網中看到的最好的解決方案。謝謝! – sunprophit 2012-01-19 01:01:40

0

在main.py

from functions import func1, func2, func3 
print func1.CAN_USE 
print func2.CAN_USE 
print func3.CAN_USE 
+0

有沒有明確命名func.py文件的解決方案?例如,如果我在函數包中添加了20個函數,它看起來不是很好的解決方案。我對嗎? – sunprophit 2012-01-18 17:41:30

+0

你是對的,這只是一個快速簡便的方法。對於一個動態的方法,你想看看@Rob Wouters answer =) – 2012-01-18 18:39:47