Как исправить функцию метода класса из модуля, дающего переменную не определенную ошибку - PullRequest
0 голосов
/ 21 февраля 2019

Поэтому я пытаюсь создать более простой модуль регистрации, но продолжаю получать ошибки, которые не имеют смысла.

Модуль находится в %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 голосов
/ 21 февраля 2019

Когда вы импортируете модуль, вы получаете только имя модуля, добавленное в ваше локальное пространство имен, а не все содержимое модуля (хотя вы можете получить его, если специально его попросите).

Итакесли вы сделаете 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.py и foo/baz.py, которые можно импортировать как foo.bar и foo.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заявление.Он даже закроет файл, если есть исключение, которое приводит к неправильному выходу блока.

0 голосов
/ 21 февраля 2019

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...