0

モジュールのサンプルコード:

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)

同じ名前を使用する理由は少なくとも2つあります。教育的(ローカル/グローバルの使用方法を学ぶため)とモジュールでの使用です。

このコードがモジュールの一部であるとしましょう:mymoduleそしてあなたは次のようなことをしたいと思います:

import mymodule

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

この例では単純化されていることが想像できるように、somevarパラメーターが多くのオプションのパラメーターの1つであり、myfuncが多くの場所で呼び出されていることを想像してください。

4

4 に答える 4

5

他の回答が言うように、これまでのところ最善のアプローチは、この非常に非常に悪い設計を回避することです。2つの異なるものに同じ名前を使用しないでください。

このひどい設計に縛られている場合、おそらくあなたの会社の最高の建築家がそれを布告し、それが交渉不可能であるため(たとえば、グローバルとパラメータの両方の名前に依存する顧客コードがたくさんある)、ビジネスの最初の注文あなたはあなたの履歴書が最新であることを確認し、それを最高のプリンターで印刷し、そしてあなたのソーシャルネットワークのメンバーと連絡を取り始めて、より賢明に運営されている場所で仕事を探すことです。次に、より良い仕事が見つかるまで健康保険を失うことを避けるために、試してみてください

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

また、名前を変更mufuncmyfuncたのは、それが呼び出されている名前だからです(ただし、非常に悪い設計を考えると、架空のSupreme Architectが実行できるようですが、関数がそれとは異なる名前で呼び出されるように指定されている可能性もあります) ?で定義されているのは、この架空の体系的な名前の競合と一致しているようですが、すでにかなり憎むべき男があなたに押し付けられたと想定されています!-)。

于 2010-08-10T17:22:39.430 に答える
1

ローカル変数にグローバル変数と同じ名前を付ける必要があるのはなぜですか? それらの1つの名前を変更することは、簡単な解決策のようです。もう 1 つのオプションは、グローバル変数をパラメーターとして渡すことですが、これは保存値にアクセスするための別の変数名を与えるだけです。

于 2010-08-10T17:15:53.783 に答える
0

2 つのソリューション:

  1. 変数の名前を に変更しますsomevar_
  2. グローバルを別のモジュールに移動します。モジュールを書くことができますmyappdefaults

    import myappdefaults
    print myappdefaults.somevar
    
于 2010-08-10T17:13:39.953 に答える
0

これが正しいやり方です。

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"
于 2010-08-10T17:24:04.437 に答える