Определение и использование функции декоратора в __init__.py - PullRequest
0 голосов
/ 28 июня 2018

РЕДАКТИРОВАТЬ: Решено! Решение в нижней части этого поста. tl; dr: я должен был использовать относительный импорт и запуск python с правильным флагом.

Так что я пытаюсь привыкнуть к некоторым вещам на Python (версия 2.7.3 - это то, что установлено на рабочем ПК), и у меня есть небольшой проект, чтобы научить меня некоторым вещам на Python. У меня есть модуль, определенный так:

curses_graphics
| __init__.py
| graphicsobject.py
| go_test.py

(следующий код) У меня есть декоратор, определенный в __init__, и я пытаюсь использовать его в методах, определенных в классе в graphicsobject.py, к которому я пытаюсь присоединить декоратор, и я тестирую его функциональность в go_test.

Когда я запускаю go_test (просто находясь в каталоге и вызывая "python go_test.py"), я получаю сообщение об ошибке "пакет не найден". То же самое происходит, если я переименую go_test в __main__.py и попытаюсь запустить пакет из его родительского каталога. Если я попытаюсь запустить go_test без импорта пакета, он не распознает мою функцию.

Как я могу ссылаться на функцию, определенную в __init__.py, из одного пакета? Неправильно ли пытаться импортировать данные из пакета?

Спасибо!

__ init__.py:

import curses
import logging
#Define logging stuff
gLog = logging.getLogger("cg_log")
gLog.basicConfig(filename="log.log", level=logging.DEBUG)

# Logging decorators for this library

def debug_announce(module_func):
    log=logging.getLogger("cg_log")
    log.info("Curses Graphics Lib:Entering function:"+module_func.__name__)
    module_func()
    log.info("Curses Graphics Lib:Left function:"+module_func.__name__)

go_test.py

@debug_announce
def logTester():
    print("A test method")

logTester()

logger.debug("Curses initialization")
screen=curses.initscr()
curses.start_color()
screen.keypad(True)

logger.debug("Initializing a green block filled with red '.'s")
block = GraphicsOBject.blankline(0, 0, 3, curses.COLOR_GREEN, curses.COLOR_RED, 20, '.')
logger.debug("Drawing the block.")
block.draw(screen)

logger.debug("Pausing execution with a getch")
screen.getch()

logger.debug("Cleaning up curses")
screen.keypad(False)
curses.endwin()
os.system('stty sane')

Я могу включить graphicsobject.py, хотя я подозреваю, что это будет хаотично, поскольку проблема возникает в первой строке go_test.py

Спасибо всем!

EDIT: Я прилагаю захват сообщений об ошибках. В первой ошибке я добавил «из импорта debug_announce curses_graphics», а во второй код не имеет этой строки.

Ошибки с импортом debug_announce и без него

EDIT: Дальнейшие поиски привели меня к относительному импорту . Для тех, у кого есть моя проблема, вы используете их для импорта чего-то определенного в вашем собственном модуле. В моем случае я добавил «from. Import debug_announce» в начало моего файла go_test.py. Я попытался запустить его и получил сообщение об ошибке «Попытка относительного импорта в неупакованном виде».

Дальнейшие поиски привели меня к этому вопросу: Как исправить «Попытка относительного импорта в неупакованном виде» даже с __init __. Py

Который сказал мне, что он не пытался запустить эту программу как пакет. Это означало, что «__init__.py» никогда не запускался, так как пакет не был импортирован. Кроме того, поскольку я был внутри пакета, попытка импортировать пакет (т. Е. "Import curses_graphics") привела бы к его поиску внутри curses_graphics ... для curses_graphics.

Чтобы выполнить это правильно, как предполагает связанный вопрос, мне нужно перейти в родительский каталог curses_graphics и выполнить его с помощью «python -m curses_graphics.go_test». Это запускает пакет с его начальными элементами и так далее и запускает скрипт go_test.

(И, FWIW, у моего кода были другие проблемы. Не принимайте это как пример того, как использовать проклятия или ведение журнала: P)

...