2010-06-21 21 views
7

Yazabileceğimi biliyorum: Python'da bir satırdaki global varlığın üzerine yazılsın mı?

foo = 'bar' 
def update_foo(): 
    global foo 
    foo = 'baz' 

Ancak gerçekten kodunun iki satırlık koduna ihtiyacım var mı? Python, alas, bana

global foo = 'baz' 

dememe izin vermeyecek Ne yazık ki tekrar eden

global foo; foo = 'baz' 

ile birlikte iki satırı da püre edebilirim. Diğer kısayollar? Python 2.6.5'deyim, ama Python 3'ün cevaplarını da duymayı çok isterim.

+2

Böyle bir alıştırmanın amacı nedir? 'Global' kullanırken, size ait olmayan bir değişkenle uğraşmak istediğinizi beyan edersiniz (muhtemelen başka bir şey değil) - ama neyin içinde olduğunu kontrol etmeden önce, neden hemen onu geçersiz kılarsınız? Pratik anlam ifade etmiyor ... –

+0

Katılıyorum, her zaman bunu yapmak istedim. Ayrıca daha akıllı tuple açmak istiyorum, ama hepsini kazanamazsın :) –

cevap

12

Sen global benim favori alternatif (oldukça kendine has bir tadı ...) kullanabilirsiniz:

Eğer thismodule başvuru yaptıktan sonra hep birlikte çalışıyoruz çünkü
import sys 
thismodule = sys.modules[__name__] 
thismodule.foo = 'bar' 

def update_foo(): 
    thismodule.foo = 'baz' 

, sen bu modülde global kullanmak gerekmez nitelikli isimleri yerine isimleri çok daha iyi bir fikir IMHO ... ama belki sadece MHO'da, Guido'nun thismodule [[ya da bu işlevselliğe sahip başka bir tanımlayıcı]] sağlamaya ikna edemedim. gestasyondaydı). foo ilk atama, küresel düzeyde, kodunuzda gibi (bu benim tercihi gider şaşırtıcı değildir sanırım foo barename için atayarak, veya yapılması ya bu açık sözdizimi ile yapılabilir

Not Açık form, ancak, bu durumda, ancak zar zor).

+0

Modülü 'bu' anahtar kelimeye mi veriyorsunuz? Bazı sebeplerden ötürü bana sadece heebiejeebies veriyor. Guido olsaydım, küresel deklarasyonlarda dev bir kırmızı yanıp sönen uyarı işareti bulunur. –

+0

Sadece zihnimi bu altın külçeyle yepyeni bir çok yönlülüğe açtın. Şerefe! – Ephexx

6

İki ifade var, başka form yok.

def update_foo(): 
    globals()['foo'] = 'baz' 

ama sadece 2 hat veya ; yaklaşımla ayırma sopa ile olur:

+0

+1: Sadece bu şekilde. –

+0

... sadece barenames kullanmak için yemin ettiyseniz ... ;-). –

3

Sen globals() sözlüğünü kullanarak şöyle yazabiliriz.

+0

True, genellikle globals() ile uğraşmakla birlikte (ve daha da çok "locals()") önerilmez. –

+1

http://www.python.org/dev/peps/pep-0020/ adresinden, "Açık, örtük olmaktan iyidir". –

1

Eğer tek satırda hepsini koymak daha iyi hissettiren olursa ...

global foo; foo = 'baz' 
2
def update_foo(): 
    globals().update(foo='baz') 
İlgili konular