2012-05-10 2 views
1

У меня есть следующий код:Как получить доступ к именам на уровне модуля в Python?

import m 

def f(m=None): 
    if m is None: 
     k = m.M() # I want this m to refer to the imported module, not the parameter 

Я действительно предпочитаю, чтобы сохранить и имя параметра и имя модуля то же самое. Есть ли способ явно ссылаться на модуль m?

ответ

2

Если вы не против изменения названия модуля только в импортируемого модуля, вы можете сделать:

import m as m_ 

def f(m=None): 
    if m is None: 
     k = m_.M() 
1

Если вам нужен параметр такой же, как имя модуля обычно, для удобочитаемости кода, но может переносить модуль временно переименован в этой области, вы можете сделать что-то вроде этого:

import m as _m 

def f(m=None): 
    if m is None: 
     k = _m.M() 

Не идеально, но, вероятно, ближе вы можете получить.

1

модуль в Python это просто еще один объект, поэтому globals() -builtin будет работать нормально:

import m 

def f(m=None): 
    if m is None: 
     k = globals()['m'].M() 
-2

Вы можете установить значение по умолчанию параметра т быть атрибутом модуля, например:

import m 

def f(m=m.M): 
    m() 

Однако затенение глобальный (имя модуля) с параметром не самый Pythonic способ сделать это. Более Pythonically, вы бы назвали параметр M, который соответствует методу M, который будет действовать как.

import m 

def f(M=m.M): 
    M() 

Таким образом, вы можете обратиться к другим атрибутам модуля, если вам нужно.

+0

и что, если вы хотите передать что-то еще функции? это нехорошее решение. – mata

+0

, то вы передаете его, и оно переопределяет значение DEFAULT в определении функции. –

+0

№. привязка модуля к параметру в качестве значения по умолчанию, чтобы иметь возможность использовать его в функции, просто не то, что вы делаете. попробуйте объяснить этот параметр кому-либо, используя ваш модуль. единственная причина, по которой это нужно сделать, - это желание, если вы захотите пройти в другом объекте, чтобы изменить функцию. – mata

0

Если это только одна функция, в которой происходит столкновение имен, вы всегда можете повторно импортировать модуль в пределах области действия и переименовать его, чтобы избежать двусмысленности.

import m 

def f(m=None): 
    import m as the_real_m 
    if m is None: 
     k = the_real_m.M() 

m в import m as the_real_m может быть немного запутанным, но здесь это не ссылка на переменную, так что нет никаких проблем с его разрешения на неправильные вещи.

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

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