2009-07-29 6 views
2

я получил следующий случай кругового импорта (здесь 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') 

ответ

4

Ответ вы придумали это правильное решение.

Однако, если вы были обеспокоены круговыми зависимостями, я бы сказал, что log_exec_time будет принадлежать его собственному файлу, поскольку он не зависит ни от чего другого в tuti.py.

+3

Лучшее решение - переместить декоратор на другой модуль и избежать круговой зависимости. – codeape

+0

Да, лучше всего избежать круговой зависимости, чем пытаться обойти ее с помощью хрупких решений, таких как этот. –

+0

Это было очевидное обходное решение и причина, почему я вообще спросил. Я больше доволен своим решением, так как это создаст модуль для хранения функции с четырьмя строками кода, и это так Java:) ... и это не соответствует цвету моей лицензии ... Nah ... Освенцим! – dhill

 Смежные вопросы

  • Нет связанных вопросов^_^