簡體   English   中英

Python模塊覆蓋雙下划線

[英]Python module overwrite double underscores

有人知道為什么我的__status__字符串無法打印嗎? 我收到一個NameError 但是,如果設置了CAT,它就可以打印CAT(它可以替代)。

所以我不能使用雙下划線,因為它現在是模塊settings_local的魔術屬性?

settings.py

__status__ = "Base"
CAT = 5
try:

    # This will work if a settings_local.py exists
    from settings_local import *

except ImportError as e:

    print "Add a settings_local blah blah"
    sys.exit()

print __status__ # returns Base
print CAT # Returns 1
print settings_local.__status__ # Returns NameError

settings_local.py

__status__ = "Development"
CAT = 1

我應該只在settings_local.py中執行此操作嗎?

status = __status__

然后以這種方式使用它?

如果目標模塊沒有__all__屬性(如果僅導入該屬性中列出的名稱),則from <module> import *語法將忽略以下划線開頭的名稱。 import聲明文檔中

如果標識符列表用星號( '*' )代替,則模塊中定義的所有公共名稱都將綁定在import語句的本地名稱空間中。

模塊定義的公共名稱是通過檢查模塊名稱空間中名為__all__的變量來確定的; 如果已定義,則必須是由該模塊定義或導入的名稱的字符串序列。 __all__中給出的名稱均被視為公開名稱,並且必須存在。 如果未定義__all__ ,則公共名稱集將包含在模塊名稱空間中找到的所有名稱,這些名稱不以下划線字符( '_' )開頭

(我的大膽強調 )。

此外,您沒有導入settings_local模塊本身。 之所以拋出NameError是因為您沒有導入模塊,只有模塊中包含的屬性。 這有效:

import settings_local

print settings_local.__status__

您的其他選擇是:

  • 兩個導入語句:

     from settings_local import * try: from settings_local import __status__ except ImportError: # no __status__ defined in the local settings pass 
  • __all__列表添加到settings_local.py模塊:

     __all__ = ['CAT', '__status__'] __status__ = "Development" CAT = 1 

請注意, Python建議不要創建新的__*__名稱

__*__名稱的Any使用,在任何情況下,如果沒有明確記錄的使用,均會受到損壞,恕不另行通知。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM