如何从给定未定义变量的模块修复类方法函数

2024-06-30 05:23:48 发布

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

因此,我试图创建一个更简单的日志模块,但我不断地得到没有意义的错误

模块位于%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类,而不是变量

我想指出的是,我知道我没有以最有效的方式做事,但这不是我来这里的目的


Tags: 模块代码messageinitdef错误loggertesting
2条回答

导入模块时,只会将模块的名称添加到本地名称空间中,而不会将模块的所有内容都添加到名称空间中(不过,如果您特别要求的话,也可以获得该名称)

因此,如果您执行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.pyfoo/baz.py,它们可以作为foo.barfoo.baz导入),那么您可能不应该使用该结构。相反,只需将localLogging/__init__.py文件重命名为localLogging.py,然后去掉子目录

另一个问题是Logger的实现。当您试图关闭在llog中创建的文件时,实际上并没有成功。您只引用close方法,但从未实际调用它(您可能希望执行llog_f.close())。我建议使用with语句来处理文件的打开和关闭:

with open(file, "a") as llog_f:
    llog_f.write("\n" + typeM + ": " + message)

此代码将自动关闭with语句后面缩进块末尾的文件。如果有异常导致块以异常方式退出,它甚至会关闭文件

日志本地.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

主.py:

from loggingLocal import Logger

logOb = Logger()

lfile = "logs/log.txt"

logOb.llog(lfile, "test", "testing testing 1 2 3")

相关问题 更多 >