2008-11-01 19 views
12

geçirildi eğer varsayılan bir değere sahip bir fonksiyon parametresi Python geçirildi olmadığını belirlemek mümkün olup olmadığını bilmek istiyorum belirleyin. Örneğin, dict.pop nasıl çalışır?isimli parametre

>>> {}.pop('test') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'pop(): dictionary is empty' 
>>> {}.pop('test',None) 
>>> {}.pop('test',3) 
3 
>>> {}.pop('test',NotImplemented) 
NotImplemented 

Pop yöntemi, varsayılan bir dönüş değeri ilk kez iletilmediğini nasıl belirler? Bu sadece C'de yapılabilecek bir şey mi?

Teşekkür

cevap

7

sana "parametresini adında" derken sen, "anahtar kelime argüman" demek sanırım. dict.pop(), anahtar kelime bağımsız değişkenini kabul etmemektedir, bu nedenle sorunun bu kısmı yanlıştır. bahsedilen

>>> {}.pop('test', d=None) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: pop() takes no keyword arguments 

, bir argüman sağlandı olup olmadığını algılamak için bir yol *args veya **kwargs sözdizimini kullanmaktır. Bazı işler ile

def foo(first, *rest): 
    if len(rest) > 1: 
     raise TypeError("foo() expected at most 2 arguments, got %d" 
         % (len(rest) + 1)) 
    print 'first =', first 
    if rest: 
     print 'second =', rest[0] 

ve çok tamamen argümanlar ya konuma göre veya adıyla sağlanabilir piton çağırma kuralını, taklit etmek mümkündür, ve argümanlar birden çok kez sağlanan **kwargs sözdizimini kullanarak (by Örneğin: konum ve isim) bir hataya neden olur. Bu sorunuzun tam anlamı ise

1

Böyle yapabilirsiniz:

def isdefarg(*args): 
    if len(args) > 0: 
     print len(args), "arguments" 
    else: 
     print "no arguments" 

isdefarg() 
isdefarg(None) 
isdefarg(5, 7) 

tam bilgi için calls üzerinde Python belgelerine bakın.

1
def f(one, two=2): 
    print "I wonder if", two, "has been passed or not..." 

f(1, 2) 

, varsayılan değeri olan bir 2 ve geçti bir 2 arasında ayrım yolu yoktur diye düşünüyorum. inspect modülünde bile böyle bir ayrım yapmanın nasıl olduğunu anlamadım.

1

ben tam istediğin ne olduğunu anlarsanız emin değilim; Ancak:

def fun(arg=Ellipsis): 
    if arg is Ellipsis: 
     print "No arg provided" 
    else: 
     print "arg provided:", repr(arg) 

bunu ne yapar? Değilse, diğerlerinin önerdiği gibi, işlevinizi *args, **kwargs sözdizimi ile bildirmeniz ve parametre varlığı için çarpışmaları kontrol etmeniz gerekir.

11

kongre arg=None kullanmak ve onu kabul ya da değil olup olmadığını da kontrol etmek

def foo(arg=None): 
    if arg is None: 
     arg = "default value" 
     # other stuff 
    # ... 

kullanmak için sık sık. Kullanıcı bağımsız değişken ise geçmemiş olarak yorumlanır None geçmek için izin vermek. `None` da parametre için anlamlı bir değeri ise

+5

Bu kullanışlı değildir. Örnek 'dict.pop' ve anahtar bulunamadığı zamanki davranışıdır - varsa ikinci parametreyi döndürür veya aksi takdirde KeyError'ı yükseltir. – Kos

+5

Bu durumda, bir nesneyle bir kapanış değişkenini oluşturabilirsiniz. MISSING = nesne(); def foo (arg = MISSING): arg is MISSING: ... ' –