gpt4 book ai didi

python - 全局变量在模块级别未定义

转载 作者:太空狗 更新时间:2023-10-30 00:31:58 28 4
gpt4 key购买 nike

(有许多类似的和更通用的问题,在通读之后一直在尝试他们的解决方案,无法让他们工作所以在这里问作为我所看到的更具体情况的版本)

由于我更多的 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 - Visibility of global variables in imported modules) 的非常棒的响应,在这个阶段这应该是可行的,但是“mylogger”变成了“ Unresolved 引用”

所以这是一种方法。我还尝试了更直接的全局性 ( 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()

当我将鼠标悬停在全局 mylogger 上时,此版本会出现“模块级别未定义全局变量”错误。

然后显然是每个其他模块跟踪自己的类实例的想法,如果我最终不得不这样做,我可以使用该方法并协调它们..但考虑到我正在尝试的事情,这是一种 hack做。

这就是我所处的位置,这就是我想要做的事情的要点......我正在尽可能多地阅读类似的问题,但他们似乎都回到了这些有点解决方案(似乎不起作用)或说“不要那样做”(这通常是个好建议,但我并没有真正采用首选的 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

所以仍然在第一个方 block :((并且仍然需要存储状态)

[编辑] 添加回溯:

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")

由于某种原因跳过 初始化.py(并将其留空)并进行显式导入工作。它还保持状态——我创建了测试文件的副本,并且我的日志输出正确地为第一个调用助手的文件“3”,第二个文件调用助手“4”。

感谢丹尼尔·罗斯曼 (Daniel Roseman) 的帮助和建议,他们让我朝着正确的方向看得更清楚了。如果您能发现为什么之前的内容不起作用,那么我将不胜感激,只是增加我对这种语言的理解,但我将继续并将您的答案标记为“已回答”,因为它有一些非常有用的反馈。

最佳答案

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

首先,真的不清楚为什么要在此处嵌套类。外部类似乎完全没用;你应该删除它。

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

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

最后,我看不到 global 语句在 someFunction 中做了什么。没有必要将名称声明为全局名称,除非您计划在您的范围内重新分配它并在全局范围内反射(reflect)该重新分配。你在这里没有这样做,所以不需要 global

顺便说一下,您还应该质疑是否需要内部 log 类。一般来说,类只有在需要在对象中存储某种状态时才有用。在这里,正如您的文档字符串所说,您有一组实用方法。那么为什么要把他们放在一个类(class)里呢?只需将它们设为 logHelpers 模块中的顶级函数(顺便说一句,Python 风格更喜欢 lower_case_with_underscore 作为模块名称,因此它应该是“log_helpers.py”)。

关于python - 全局变量在模块级别未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26773932/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com