2011-01-12 20 views
8

İsteğe bağlı varsayılan argüman sayısını isteğe bağlı olarak bir Python işlevine iletmek mümkün mü? Örneğin,Koşullu olarak varsayılan olarak adlandırılmış bağımsız değişkenlerin sayısını bir tanıma geçirme

. bir işlev var:

def func(arg, arg2='', arg3='def') 

Şimdi mantık ben arg3 geçti gerekiyorsa belirleyen bir durum var, ben böyle yapmak is:

if condition == True: 
    func('arg', arg2='arg2', arg3='some value') 
else: 
    func('arg', arg2='arg2') 

Soru şu ki, steno olabilir gibi: Aklıma

func('arg', 'arg2', 'some value' if condition == True else # nothing so default gets picked 
) 

cevap

5

tek yol olacağını

func("arg", "arg2", **({"arg3": "some value"} if condition == True else {})) 

veya

func("arg", "arg2", *(("some value",) if condition == True else())) 

ama bunu yapmayın lütfen.

if condition: 
    arg3 = "some value", 
else: 
    arg3 =() 
func("arg", "arg2", *arg3) 
+2

Karşınızda ne var? ** ve *? – Erin

+2

'' '' '' '' 'a karşı hiçbir şey. Sadece orijinal kodun daha okunabilir olduğunu düşünüyorum. Sanırım benden hoşlanmıyorum. –

+0

Alternatif olarak, bir argüman sözlüğü oluşturmak için bazı koşullu mantık (işlev çağrısının dışında) kullanılabilir.Daha sonra '' 'ile geçilebilirler. Bu, daha fazla sayıda argümanla okunabilir durumda. – Wilduck

8

Eğer else sonra bir şeyler olması gerekir geçerli Python sözdizimi olmaz: böyle kendini verilen kodu, ya da bir şey kullanın. Ne normalde yapılır geçerli:

func('arg', 'arg2', 'some value' if condition else None) 

ve işlev tanımı buna göre değiştirilir: Varsayılan argüman

def lots_of_defaults(arg1 = "foo", arg2 = "bar", arg3 = "baz", arg4 = "blah"): 
    pass 

bir yeri vardır bir işlevi varsa ve

def func(arg, arg2='', arg3=None): 
    arg3 = 'def' if arg3 is None else arg3 
1

istediğiniz programınızda devam eden başka bir şeye bağlı olarak bunlardan bazılarına farklı değerler iletin, basit bir şekilde ** kullanıp argüman adlarını ve oluşturduğunuz değerleri Program mantığında. Sesli arama gider ne belirleyen mantığı çok varsa

different_than_defaults = {} 
if foobar: 
    different_than_defaults["arg1"] = "baaaz" 
if barblah: 
    different_than_defaults["arg4"] = "bleck" 

lots_of_defaults(**different_than_defaults) 

Bu, sizin işlevini çağırarak noktasında kodunuzu tıkanma değil yararı vardır. Varsayılan değerlere sahip olmayan herhangi bir argümanınız varsa, sözlüğünüzü aktarmadan önce geçirdiğiniz değerleri eklemek için dikkatli olmanız gerekir.

0

Bir yardımcı fonksiyonunu başka işlevi çağırmak ve geçmek istemediğiniz değişkenlerini belirtmek için caller.DONT_PASS kullanmak

def caller(func, *args, **kwargs): 
    return func(*args, **{k:v for k,v in kwargs.items() if v != caller.DONT_PASS}) 
caller.DONT_PASS = object() 

Bu fonksiyonu kullanarak yazabilirsiniz. Bu caller() tek destek şartlı anahtar kelime argümanlar geçen o

caller(func, 'arg', 'arg2', arg3 = 'some value' if condition else caller.DONT_PASS) 

Not. Konumsal argümanları desteklemek için, işlevi incelemek üzere inspect modülünü kullanmanız gerekebilir.

İlgili konular