我的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?
我的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?
試試這個使用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
)。
它看起來像我在所有的萬維網中看到的最好的解決方案。謝謝! – sunprophit 2012-01-19 01:01:40
在main.py
from functions import func1, func2, func3
print func1.CAN_USE
print func2.CAN_USE
print func3.CAN_USE
有沒有明確命名func.py文件的解決方案?例如,如果我在函數包中添加了20個函數,它看起來不是很好的解決方案。我對嗎? – sunprophit 2012-01-18 17:41:30
你是對的,這只是一個快速簡便的方法。對於一個動態的方法,你想看看@Rob Wouters answer =) – 2012-01-18 18:39:47
什麼決定了這個'CAN_USE'的價值?你可能想用'__all__'代替。 – 2012-01-18 18:35:19
現在CAN_USE由func.py的開發者決定。如果爲false,那麼使用該函數的客戶端將不會看到這個func.py.而關於\ _ \ _ all \ _ \ _ - 我想只有當我知道函數的名字時纔有效。我希望它更動態,至少在客戶端模塊中 - 比如我的例子中的main.py。因此,main.py中沒有func.py的名字,只是包名'functions'。從我的角度來看,這是更好的做法。糾正我,如果我錯了。 – sunprophit 2012-01-19 00:49:42