我想要做這樣的事情嗎?擴展__all__。我怎樣才能把模塊__all__列表?
# __init__.py
import a_module
__all__ = [
'a_module',
]
__all__.extend(a_module.__all__) # it doesn't work
# AttributeError: 'module' object has no attribute '__all__'
有沒有辦法做到這一點?
我想要做這樣的事情嗎?擴展__all__。我怎樣才能把模塊__all__列表?
# __init__.py
import a_module
__all__ = [
'a_module',
]
__all__.extend(a_module.__all__) # it doesn't work
# AttributeError: 'module' object has no attribute '__all__'
有沒有辦法做到這一點?
更新:我不明白爲什麼你就是不:
from a_module import *
...如果你想要做的是重新發布的一切a_module
發佈...這是一個連PEP8「制裁」使用明星進口的情況,這通常令人沮喪。
...現在如果上述方案是不是你的作品,這裏或多或少手寫相當於:(含模塊)
dir()
應該給你的屬性列表中的對象:
__all__.extend(dir(a_module))
如果您想篩選出的東西開始__
和_
,只是:
__all__.extend(x for x in dir(a_module) if not x.startswith('_'))
這個S無論該模塊是否聲明__all__
都可以工作。
而且,要完全模仿Python的考慮所有非下劃線前綴事情模塊作爲公衆,除非__all__
聲明的默認行爲:
適合自己 - 我更喜歡三元論,如果:在這種情況下,我覺得它只是可讀的,其優點是它不會重複'__all __。extend(...)'部分邏輯,所以它完全是乾的。但是我也更習慣於函數式編程風格,其中'if-else'(就像該語言的其他部分一樣)是一個表達式,因此任何東西都可以嵌套。 –
我認爲最好寫塊if ... else語句,而不是內聯。內聯如果有時看起來像魔術一樣 – kharandziuk
無論是神奇的,正常的還是美好的,都是真正的習慣問題,你的背景是什麼,以及你喜歡一件事或一種風格的傾向。但是,我更想知道爲什麼'from a_module import *'不適合您的需求。 –
你說的「它不工作」是什麼意思?任何錯誤? – alecxe
@alecxe我加了一些說明 – kharandziuk