2012-01-10 23 views
5

Python'da bir yöntemin varsayılan argüman değerlerine nasıl programlanabilir? Örneğin, Python'daki varsayılan değişken değerlerine erişme

def test(arg1='Foo'): 
    pass 

nasıl dize test içeride 'Foo' erişebilir aşağıda bunlar?

+1

piton 3'te kaldırılmış olabilir? – Kevin

+0

Sadece "arg1" yazmayı değil mi demek istiyorsun? –

+0

Eğer 'test' çağrılırken 'arg1' sağlamıyorsanız, 'arg1' varsayılan olarak '' Foo '' – TyrantWave

cevap

14

Onlar ler vardır

+0

+1: Bu! işe yarıyor. –

2

Ricardo Cárdenes doğru yolda. Aslında,test'un testişlevine ulaşılması çok daha zor olacaktır. inspect modül size daha fazla alacak, ancak çirkin olacak: Sonradan anlaşıldı ki Python code to get current function into a variable?

, sen işlevi içinde test başvurabilirsiniz:

def test(arg1='foo'): 
    print test.__defaults__[0] 

foo dışarı yazdırır. Ama sadece sürece test aslında tanımlandığı gibi çalışacak test atıfta: etrafta bu işlevi geçen niyetinde olmadığını

>>> test() 
foo 
>>> other = test 
>>> other() 
foo 
>>> del test 
>>> other() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in test 
NameError: global name 'test' is not defined 

Yani, gerçekten inspect rotayı :(

+0

Bu izlenim altındaydım, Ricardo'nun cevabım hakkındaki yorumunda belirtildiği gibi, 'testin' testin yerel kapsamında olduğunu ortaya koyuyor. –

+0

bilmek harika! cevabımı yansıtacak şekilde güncelledim! –

+1

Eğer test2(): def: print locals(), '\ n \ n', globals() 'komutunu kullanırsak, 'test2' nin globals olduğunu ve yerlilerde hiçbir şey olmadığını görürüz. –

0

Bu gitmek gerekebilir (hiç) değil çok şık, ama ne istediğinizi yapar:.

def test(arg1='Foo'): 
    print(test.__defaults__) 

test(arg1='Bar') 

çok Python 3.x ile İşleri

+2

Neden globals() '? 'test' kendi kapsamında yereldir, buna gerek yok. –

+0

@ RicardoCárdenes, haklısınız. Bunu bilmiyordum, teşekkürler. Şimdi tamir ediyorum. –

4

test.func_defaults yılında tored düşünün:

def test(arg1='Foo'): 
    pass 

In [48]: test.func_defaults 
Out[48]: ('Foo',) 

.func_defaults argümanlar kodunuzda göründükleri sırayla, bir dizi olarak, size varsayılan değerleri verir.

Görünüşe göre, func_defaults sen bunu yapmak isteyebilirsiniz neden gösteren bir örnek verebilir

+4

Bence func_defaults sadece Python 2.x üzerinde çalışıyor. __defaults__' Python 2.7 ve 3.2 üzerinde çalışıyor gibi görünüyor. –

+0

@RobWouters: python 3'ü kullanmamama rağmen bilmem. – Marcin

İlgili konular