在modu中未定义全局变量

2024-09-29 21:52:16 发布

您现在位置:Python中文网/ 问答频道 /正文

(有许多类似的、更一般的问题,在阅读完之后一直在尝试解决,但无法让它们发挥作用,所以在这里作为我所看到的情况的一个更具体的版本提出问题)

我想我真的很怀念Python是怎么做的,因为我的C/C++背景更丰富。这就是我现在要做的。

我从两个模块开始建立我的项目的其余部分,部分作为一个健全的检查和概念证明。一个模块在我运行时将事情记录到一个文件中,同时还存储来自多个模块的数据(最终将它们全部打包并根据请求转储它们),在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 - Visibility of global variables in imported modules),在这个阶段应该可以工作,但是“mylogger”变成了一个“未解析的引用”

所以这是一种方法。我还尝试了更直接的全局搜索(Python: How to make a cross-module variable?

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上得到一个“parameter'self'unfilled”错误,各种报告似乎都表明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()

当我悬停Global mylogger时,这个版本会出现“Global variable is undefined at the module level”错误。

然后有一个想法是,每个模块显然都在跟踪一个类的自己的实例,如果我不得不这样做,我可以使用这个方法来协调它们。。但考虑到我要做的事,这算是一种攻击。

这就是我所处的位置,这就是我要做的要点。。。我在尽可能多地阅读类似的问题,但所有这些问题似乎都回到了这些解决方案(似乎不起作用)或说“不要那样做”(这通常是个好建议,但我并没有真正摸索出一个大型项目中保持多个持续的非静态类组织的首选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,我让它和迷你班一起工作。我不知道为什么其他方法不起作用,但这似乎可以解决问题。 (资源: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")

因为某种原因跳过 初始化.py (并将其留空)并进行明确的输入工作。它还保持状态-我创建了一个测试文件的副本,我的日志输出正确地有“3”表示第一个文件调用helper,而“4”表示第二个文件调用helper。

感谢丹尼尔罗斯曼的帮助和建议,他们让我看起来更正确的方向。如果你能发现为什么之前的东西不起作用,我会非常感谢你能增加我对这门语言的理解,但我会继续把你的回答标为“已回答”,因为它有一些非常有用的反馈。


Tags: frompyimportselfsrcinitdefmyclass
1条回答
网友
1楼 · 发布于 2024-09-29 21:52:16

在我开始之前,请注意PyCharm警告并不是真正的Python错误:如果您运行代码,您可能会得到更有用的反馈(请记住,对Python这样的动态语言进行静态分析只能得到目前为止的结果,很多事情在您真正运行代码之前是无法解决的)。

首先,还不清楚为什么要在这里嵌套类。外部类似乎完全无用;您应该删除它。

关于“self”的错误消息的原因是您定义了一个实例方法,该方法只能在log的实例上调用。您可以将mylogger(绝对不需要双下划线前缀)设置为实例:mylogger = log()-然后导入该实例,或者导入该类并在使用它的地方实例化它。

因此,在第一个代码片段中,错误消息非常清楚:您尚未定义mylogger。使用我上面的建议,您可以执行from helpers import mylogger,然后直接调用mylogger.classEnter()

最后,我看不出global语句在someFunction中做了什么。不需要将名称声明为全局名称,除非您计划在您的作用域内重新分配该名称,并将该重新分配反映在全局作用域中。你在这里不需要这么做,所以不需要global

顺便说一下,您还应该质疑是否需要内部的log类。一般来说,类只在需要在对象中存储某种状态时才有用。这里,正如docstring所说,您有一个实用程序方法的集合。为什么要把他们放在一个班里?只需在logHelpers模块中使它们成为顶级函数(顺便说一下,Python样式更喜欢用lower_case_with_underscore作为模块名,因此应该是“log_helpers.py”)。

相关问题 更多 >

    热门问题