я получил следующий случай кругового импорта (здесь severly упрощенно): модульPython: Как избавиться от круговой зависимости, включающей декоратор?
array2image.py
преобразования:
import tuti
@tuti.log_exec_time # can't do that, evaluated at definition time
def convert(arr):
'''Convert array to image.'''
return image.fromarray(arr)
tuti.py
Test Utils модуль:
import array2image
def log_exec_time(f):
'''A small decorator not using array2image'''
def debug_image(arr):
image = array2image.convert(arr)
image = write('somewhere')
Он потерпел неудачу с NameError. Это выглядело не так, как в действительности, там не было круговой зависимости. Я искал аккуратно способ избежать этого или объяснения ... и на полпути через этот вопрос я нашел его.
Перемещение import
ниже декоратора в tuti.py
решает NameError:
def log_exec_time(f):
'''A small decorator not using array2image'''
import array2image
def debug_image(arr):
image = array2image.convert(arr)
image = write('somewhere')
Лучшее решение - переместить декоратор на другой модуль и избежать круговой зависимости. – codeape
Да, лучше всего избежать круговой зависимости, чем пытаться обойти ее с помощью хрупких решений, таких как этот. –
Это было очевидное обходное решение и причина, почему я вообще спросил. Я больше доволен своим решением, так как это создаст модуль для хранения функции с четырьмя строками кода, и это так Java:) ... и это не соответствует цвету моей лицензии ... Nah ... Освенцим! – dhill