簡體   English   中英

處理模塊中未定義的全局(python)

[英]Dealing with undefined global in module (python)

所以我有一些像這樣的python代碼

import mymodule

sum_global= mymodule.populateGlobalList("bigdict.txt")

等等...... mymodule 中的代碼包括方法

def populateGlobalList(thefile):
    #do the stuff

到目前為止一切正常。

但是在mymodule 的其他地方我有一個方法說

def usefulFunction(arg1, arg2):
   #lotsofstuff
   if arg1 not in sum_global:
      #add to list

所以解釋器在 undefined sum_global跳閘,這是有道理的。 現在有用的函數可以將sum_global作為參數,至少在理論上是這樣。 sum_global旨在成為一個英語詞典,廣泛用於檢查遇到的單詞是否是英語單詞(或至少拼寫正確)。 由於這種情況經常發生,因此將其本地化會帶來不必要的尷尬。

另一方面,只是在模塊中聲明一個全局sum_global (本質上是為了欺騙解釋器),目的是在導入mymodule的程序中填充這個空容器,感覺完全錯誤。

這種情況下的聲音設計是什么?

每個模塊都有自己的全局命名空間。 您將sum_global添加到錯誤的模塊中,它不在mymodule

要么將sum_global放在mymodule要么將其作為參數傳遞給需要它的函數。

聽起來好像您想推遲計算sum_global值,直到您有了文件名; 你可以在這里populateGlobalList()設置全局; 這一切都在mymodule

sum_global = None

def populateGlobalList(filename):
    global sum_global
    if sum_global is None:
        sum_global = "result of your population work"

此函數不返回數據,它在模塊中設置全局變量(前提是尚未設置)。

但是,您應該盡量避免創建這樣的全局變量。 由於您的模塊的用戶必須提供文件名,如果用戶代碼跟蹤populateGlobalList()調用的結果並將其顯式傳遞給有用的函數()`調用,則效果會更好:

import mymodule

sum_global = mymodule.populateGlobalList("bigdict.txt")

result = mymodule.usefulFunction(arg1, arg2, sum_global)

並重組usefulFunction()以需要這樣的參數。

下一步是讓您的模塊為此使用一個

class MyClass(object):
    def __init__(self, filename):
        self._populate()

    def _populate(self):
        self.sum = "result of your population work"

    def useful_function(self, arg1, arg2):
        # do work with self.sum

然后在任何地方使用該類:

 interesting_object = mymodule.MyClass('bigdict.txt')
 result = interesting_object.useful_function(arg1, arg2)

暫無
暫無

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

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