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

时间:2019-02-21 00:35:05

标签: python windows

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

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

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

2 个答案:

答案 0 :(得分:0)

loggingLocal.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

main.py:

from loggingLocal import Logger

logOb = Logger()

lfile = "logs/log.txt"

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

答案 1 :(得分:0)

导入模块时,只会将模块的名称添加到本地名称空间中,而不会添加模块的所有内容(尽管如果明确要求也可以获取)。

因此,如果您执行import loggingLocal(不需要__init__部分,请参见下面的更多内容),则只会在主模块的命名空间中获得名称loggingLocal。要访问其中的Logger类,您需要使用loggingLocal.Logger

或者,您可以使用备用导入语法from some_module import some_name来具体说明要从导入的模块复制到自己的名称空间中的特定名称。在您的情况下,您可能需要from loggingLocal import Logger。您可以根据需要提供多个名称,也可以提供*而不是任何名称,在这种情况下,您将获得模块__all__属性中列出的任何名称,或每个全局变量在另一个模块中,该模块的名称不能以下划线开头。

您的代码中还有其他一些小错误。我在上面提到过一个,您在__init__语句中命名模块名称的import部分。不用了__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语句后的缩进块末尾自动关闭文件。如果有异常导致该块以异常方式退出,它甚至会关闭文件。