Как использовать именованные параметры и глобальные переменные с одинаковыми именами в Python? - PullRequest
0 голосов
/ 10 августа 2010

Пример кода из модуля:

somevar = "a"

def myfunc(somevar = None):
    # need to access both somevars ???
    # ... if somevar was specified print it or use the global value
    pass

if __name__ == '__main__':
    somevar = "b" # this is just for fun here
    myfunc("c")
    myfunc() # should print "a" (the value of global variable)

Существует как минимум две причины для использования одного и того же имени: образовательное (чтобы узнать, как использовать локальные / глобальные) и использование в модулях.

Допустим, этот код является частью вашего модуля: mymodule, и вы хотите сделать что-то вроде:

import mymodule

mymodule.samevar = "default"
...
mymodule.myfunc(somevar = "a")
...
mymodule.myfunc()

Как вы можете себе представить, в этом примере это упрощенно, представьте, что параметр somevar является одним из многих необязательных параметров и что myfunc вызывается во многих местах.

Ответы [ 4 ]

5 голосов
/ 10 августа 2010

Безусловно, лучший подход, как говорят другие ответы, состоит в том, чтобы избежать этого очень, очень плохого дизайна: просто не используйте одни и те же имена для двух разных вещей!

Если вы заперты в этом ужасном проекте, возможно, потому что Верховный Архитектор вашей компании принял решение об этом, и он просто не подлежит обсуждению (например, есть тонны кода клиента, полагающегося на имена как глобального, так и параметра), первый бизнес для вас - убедиться, что ваше резюме актуально, распечатать его на лучшем принтере и начать общаться с членами вашей социальной сети, чтобы найти работу в месте, которое работает более разумно; Затем, чтобы не потерять медицинскую страховку, пока не найдете лучшую работу, попробуйте

def myfunc(somevar = None):
    if somevar is None:
        print globals().get('somevar')
    else:
        print somevar

Я также переименовал ваш mufunc в myfunc, потому что это имя, с которым он называется (хотя, учитывая невероятно плохой замысел, ваш гипотетический Верховный Архитектор, кажется, способен выполнить, возможно, он также указывал, что функция вызывается не так, как определено с помощью имени? Похоже, что это сопровождается систематическим конфликтом имен, который, как предполагается, этот гипотетический, но уже довольно ненавистный парень навязал вам! -).

1 голос
/ 10 августа 2010

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

0 голосов
/ 10 августа 2010

Это правильный способ делать вещи.

somevar = "a"

def mufunc(_somevar = None):
    global somevar
    if _somevar:
        print _somevar
    else:
        print somevar

if __name__ == '__main__':
    global somevar
    somevar = "b"
    myfunc("c")
    myfunc() $ should print "c"
0 голосов
/ 10 августа 2010

Два решения:

  1. Переименуйте переменную, т. Е. В somevar_.
  2. Переместите глобал в другой модуль.Вы можете написать модуль myappdefaults

    import myappdefaults
    print myappdefaults.somevar
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...