因此,我试图创建一个更简单的日志模块,但我不断地得到没有意义的错误
模块位于%appdata%/python/site-packages/loggingLocal/__init__.py
模块代码如下:
class Logger:
def __init__(self):
pass
@classmethod
def llog(cls, file, typeM, message):
llog_f = open(file, "a")
llog_f.write("\n" + typeM + ": " + message)
llog_f.close
我使用的模块代码如下:
import loggingLocal.__init__
logOb = Logger()
lfile = "logs/log.txt"
logOb.llog(lfile, "test", "testing testing 1 2 3")
我希望logs/log.txt
中的文件包含test: testing testing 1 2 3
,但是我在第三行得到一个错误:Undefined variable 'Logger'
。这毫无意义,因为我将logOb
赋值给Logger
类,而不是变量
我想指出的是,我知道我没有以最有效的方式做事,但这不是我来这里的目的
导入模块时,只会将模块的名称添加到本地名称空间中,而不会将模块的所有内容都添加到名称空间中(不过,如果您特别要求的话,也可以获得该名称)
因此,如果您执行
import loggingLocal
(不需要__init__
部分,下面将详细介绍),那么您只会在主模块的命名空间中获得名称loggingLocal
。要访问其中的Logger
类,需要使用loggingLocal.Logger
或者,您可以使用可选的导入语法
from some_module import some_name
,具体说明要从导入的模块复制到自己的命名空间中的特定名称。在您的情况下,您可能需要from loggingLocal import Logger
。如果需要,可以指定多个名称,也可以指定*
而不是任何名称,在这种情况下,您将获得模块的__all__
属性中列出的任何名称,或者其他模块中名称不以下划线开头的所有全局变量您的代码中还有其他一些小错误。我在上面提到的一个例子,您在
import
语句中命名模块名的__init__
部分。那是不需要的__init__.py
是用于组成包的根部分的模块的文件名。也就是说,foo/__init__.py
成为foo
模块。如果您出于其他原因不需要包(例如,因为您还有foo/bar.py
和foo/baz.py
,它们可以作为foo.bar
和foo.baz
导入),那么您可能不应该使用该结构。相反,只需将localLogging/__init__.py
文件重命名为localLogging.py
,然后去掉子目录另一个问题是Logger的实现。当您试图关闭在
llog
中创建的文件时,实际上并没有成功。您只引用close
方法,但从未实际调用它(您可能希望执行llog_f.close()
)。我建议使用with
语句来处理文件的打开和关闭:此代码将自动关闭
with
语句后面缩进块末尾的文件。如果有异常导致块以异常方式退出,它甚至会关闭文件日志本地.py
主.py:
相关问题 更多 >
编程相关推荐