代碼.py:
"""
Chekcs if isset(ABC) or not.
if not set - sets "ABC = 10".
"""
try: ABC
except: ABC = 10
print(ABC)
輸出 => "10"
命令列:
python -c "ABC = 20; 匯入代碼"
預期列印“20”,但輸出“10”。
有沒有辦法解決這個問題?
uj5u.com熱心網友回復:
全域變數,盡管名稱不同,但并非對程式的每個部分都是全域的。每個模塊都有自己的全域命名空間,并且相同的變數可以存在于不同的命名空間中,具有不同的值。
在您的示例中,您正在運行命令列上給出的腳本。這被解釋為解釋器中的__main__模塊。所以 in __main__,ABC將等于 20。但是當主模塊匯入時code,它有自己的命名空間。它看不到__main__.ABC已經存在的值,因此它創建(并列印)自己的ABC值。
至于“修復”代碼,我不確定是否值得嘗試。你可能會 在它的命名空間中code匯入__main__和瀏覽,但這對于一個愚蠢的目標來說似乎是很多作業。幾乎可以肯定有更好的方法來實作您的實際最終目標(例如列印10),并且不太可能弄亂其他模塊的命名空間。我懷疑這是一個XY 問題,所以當我在回答你關于為什么你擁有的代碼的行為方式的合理問題時,我真的不認為有一個合理的解決方案。
uj5u.com熱心網友回復:
我認為在匯入模塊之前不可能設定一個值:匯入模塊時,它不一定共享相同的變數集。模塊內的變數本質上在其背景關系范圍內。
您可能能夠設定臨時環境變數或用于sys.argv獲取通過命令列傳遞的引數,但這非常有限(例如,您不能傳遞 Python 物件)。
我個人會使用一個類來實作類似的功能(但是您確實需要先匯入它)。例如:
在代碼.py中:
class SampleClassName():
def __init__(self, ABC = 10) -> None:
print(ABC)
# The rest of your logic
然后,您可以使用以下方法創建此類的實體:
python3 -c "from code import SampleClassName; instance = SampleClassName(20)"
請注意,此處ABC = 10定義了 ABC 的默認值。它沒有設定,它將是默認值 10。
您可能想通過閱讀Python 檔案來了解有關類的更多資訊
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/318180.html
上一篇:MySQL介紹以及簡單查詢
