簡體   English   中英

全局變量在模塊級別未定義

[英]Global variable is undefined at the module level

(有許多類似的和更通用的問題,在閱讀完它們之后一直在試用它們的解決方案,不能讓它們工作所以在這里要求我看到的更具特定情況的版本)

我認為我真的很想念 - 由於我更多的C#/ C ++背景,Python如何處理OOP。 所以這就是我現在正在努力做的事情。

我從兩個模塊開始設置項目的其余部分,部分是作為一個完整性檢查和概念驗證。 一個模塊將內容記錄到文件中,同時還存儲來自多個模塊的數據(最終將它們打包並根據請求轉儲它們)在PyCharm中完成所有這些並提及它建議的錯誤警告,並使用Python 2.7

Module 1:
  src\helpers\logHelpers.py
    class LogHelpers:
      class log:
         def classEnter():
           #doing stuff
         def __init__(self):
           self.myLog = LogHelpers.log()  #forgot to mention this was here initially
      [..] various logging functions and variables to summarize what's happening
    __builtin__.mylogger = LogHelpers

Module 2:
  src\ULTs\myULTs.py
    mylogger.myLog.classEnter()

(模塊和根src \\中都有一個空的init .py文件)

因此,根據這里非常棒的響應( Python - 導入模塊中的全局變量的可見性 ),這應該是有效的,但是'mylogger'成為'未解析的引用'

這是一種方法。 我也嘗試過更直接的全局變量Python:如何制作跨模塊變量?

Module 1:
  src\helpers\logHelpers.py
    class LogHelpers:
      class log:
         def classEnter(self):
           #doing stuff
         def __init__(self):
           self.myLog = LogHelpers.log()  #forgot to mention this was here initially
      [..] various logging functions and variables to summarize what's happening
    mylogger = LogHelpers

  __init__.py
     __all__ = ['LogHelpers', hexlogger]
    from .logHelpers import * 

Module 2:
  src\ULTs\myULTs.py
    from helpers import mylogger
    mylogger.myLog.classEnter()

這個版本在classEnter上得到一個“參數'自'未填充'錯誤,各種報告似乎表明mylogger未初始化(誤導錯誤代碼,但這似乎意味着什么)

然后我試了這個..

Module 1:
  src\helpers\logHelpers.py
    class LogHelpers:
      class log:
         def classEnter(self):
           #doing stuff
         def __init__(self):
           self.myLog = LogHelpers.log()  #forgot to mention this was here initially
      [..] various logging functions and variables to summarize what's happening
    __mylogger = LogHelpers

  __init__.py
     __all__ = ['LogHelpers', hexlogger]
    from .logHelpers import * 

Module 2:
  src\ULTs\myULTs.py
    from helpers import mylogger

    def someFunction(self):
      global mylogger
      mylogger.myLog.classEnter()

當我將鼠標懸停在全局mylogger上時,此版本會出現“模塊級別未定義全局變量”錯誤。

然后有一個想法是每個其他模塊顯然跟蹤它自己的一個類的實例,如果我最終不得不使用該方法並協調它們......但考慮到我正在嘗試做什么,這就是一種黑客攻擊。

這就是我所處的位置,這就是我要做的事情的要點......我正在閱讀盡可能多的類似問題,但所有這些問題似乎都回到了這些解決方案(其中似乎沒有工作)或說'不要那樣做'(這通常是一個很好的建議,但我並沒有真正討厭保留為大型項目組織的多個正在進行的非靜態類的首選Pythony方式 - 除了將它們全部推到一個目錄中)

思考? (我在這里破壞Python有多糟糕?)

[編輯]根據反饋嘗試了一個迷你版本完全消除了內部類:好吧,基於你所說的本地小型課程也是如此:

class testClass:
    def __init__(self):
        self.testVar = 2
    def incrementVar(self):
        self.testVar += 1
myClass = testClass()

通過init .py進行設置

__all__ = [myClass]
from .logHelpers import myClass

去了其他模塊和

from helpers import myClass
class Test_LogHelpers(unittest.TestCase):
    def test_mini(self):
        myClass.incrementVar()

直接使用它而不是查看PyCharm,沒有全局任何東西.. NameError: name 'myClass is not defined

所以仍然在方形一:((仍然需要存儲狀態)

[編輯]添加回溯:

Traceback (most recent call last):
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 3.4.1\helpers\pycharm\utrunner.py", line 124, in <module>    module = loadSource(a[0])
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 3.4.1\helpers\pycharm\utrunner.py", line 40, in loadSource    module = imp.load_source(moduleName, fileName)
  File "C:\[...mylocation...]\py\src\ULTs\LogHelpers_ULT.py", line 3, in <module>    from helpers import myClass
  File "C:\[...mylocation...]\py\src\helpers\__init__.py", line 7, in <module>
    __all__ = [myClass]
NameError: name 'myClass' is not defined

================================================== ==========================

kk,我讓它與miniclass一起工作。 我不知道為什么其他方法/方法不起作用,但這似乎解決了問題。 (參考資料: http//docs.python-guide.org/en/latest/writing/structure/,http : //mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html

**logHelpers.py**
[... some static logging functionality ...]

class testClass:
    def __init__(self):
        self.testVar = 2

    def incrementVar(self, source):
        self.testVar += 1
        mylogger.myLog.info(source + " called, new val: " + str(self.testVar))
myClass = testClass()

**test_LogHelpers_ULT.py**
import unittest

from helpers.logHelpers import myClass    

class Test_LogHelpers(unittest.TestCase):
    def test_mini(self):
        myClass.incrementVar("LogHelpers")

出於某種原因,跳過init .py(並將其留空)並進行顯式導入工作。 它還保持狀態 - 我創建了測試文件的副本,我的日志輸出正確地為第一個調用助手的文件'3',並為第二個文件調用幫助器'4'。

感謝Daniel Roseman的幫助和建議,他們讓我看起來朝着正確的方向前進。 如果你能發現為什么以前的東西不能正常工作,那么我會非常感激地加入我對這種語言的理解,但是我會繼續把你的答案標記為'已回答',因為它有一些非常有用的反饋。

在我開始之前,請注意PyCharm警告不是實際的Python錯誤:如果你運行你的代碼,你可能會得到更多有用的反饋(記得像Python這樣的動態語言的靜態分析只能讓你到目前為止,許多事情都不能解決,直到您實際運行代碼)。

首先,你真的不清楚為什么你在這里有嵌套類。 外層階級似乎完全沒用; 你應該刪除它。

關於“self”的錯誤消息的原因是您已定義了一個實例方法,該方法只能在log實例上調用。 你可以創建一個mylogger (絕對不需要雙下划線前綴)一個實例: mylogger = log() - 然后導入它,或者導入類並在使用它的地方實例化它。

因此,在您的第一個代碼段中,錯誤消息非常明確:您尚未定義mylogger 使用上面的推薦,您可以from helpers import mylogger ,然后直接調用mylogger.classEnter()

最后,我看不出那個global聲明在someFunction做了someFunction 除非您計划在范圍內重新分配名稱並將該重新分配反映在全局范圍內,否則無需將名稱聲明為全局名稱。 你不是在這里做的,所以不需要global

順便說一句,你還應該質疑你是否需要內部log類。 一般來說,只有在需要在對象中存儲某種狀態時,類才有用。 在這里,正如您的docstring所說,您有一組實用方法。 那么為什么要把它們放在課堂上呢? 只需在logHelpers模塊中創建頂級函數(順便說一句,Python樣式更喜歡使用lower_case_with_underscore作為模塊名稱,因此它應該是“log_helpers.py”)。

暫無
暫無

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

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