- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
(有许多类似的和更通用的问题,在通读之后一直在尝试他们的解决方案,无法让他们工作所以在这里问作为我所看到的更具体情况的版本)
由于我更多的 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/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!