2013-10-29 20 views
11

Bir fonksiyon için yinelenen bir argüman için boş bir tuple varsayılan olarak kullanmak için herhangi bir dezavantaj var mı? İşlevde istediğinizi değiştirilemeyen yinelenebilir olduğu varsayılır. , ör.Boş tuple işlevinde varsayılan olarak yinelenen bağımsız değişken kullanımı

def foo(a, b=()): 
    print a 
    for x in b: 
    print x 

Ben bu kullanım şeklini pek çok örnek bulmak gibi olamaz.

+0

işlevi 'for' döngünün dışında bir şey yapıyor mu: argümanlar ayarlanmamış varsayılan argümanlar için

tipik yaklaşım açıkça vurguladığı Yok bunları ayarlamak olacaktır ? – DSM

+0

Hayır, işlevde istediğinizin değişmez yinelenebilir olduğunu varsayıyorum. – Ben

+1

Bir şey mi eksik? Varsayılan argümanın kullanılabileceği yegane yöntem, foo() 'gibi argümanlar olmadan" foo "kelimesini manuel olarak çağırmanızdır. Ama eğer fonksiyonun yinelenebilir değilse, sadece bir şey yaptığını biliyorsan, neden bunu yazardın? – DSM

cevap

9

Değişmez bir tekrarlanabilirliğe ihtiyaç duyduğunuz zaman için herhangi bir olumsuzluk düşünemiyorum. Ben sadece kullanılmıyor çünkü default_list=None ve default_list = default_list or None modelinin yinelenebilir yineleyiciler için kullanıldığı ve insanların yinelenen değişmez olduğunda daha az sıklıkta görülen durumlarda (gerçek gereksinim olmadığı için) değiştirmeye zahmet etmediği düşünüyorum . Değişken varsayılan argümanlarda olduğu gibi beklenmedik bir davranış kesinlikle yoktur.

1

Varsayılan olarak immutable boş bir tuple tasarlamanızla ilgili hiçbir sorun yoktur. Bununla birlikte, sezgisel olmayan tasarım yaklaşımı olarak düşünülebilir. Tuple'daki belirli yerlere yapılan göndermeler, bir istisnanın ortaya çıkmasına neden olabilir. Eğer argüman kontrolleri oluşturmaya yetecek kadar dikkatli iseniz, bu bir problem olmayacaktır, fakat kodun geri kalanını belirli konumlardan veri beklerseniz ve tuple boş olduğunu doğrulamazsanız, bu hatalara neden olur.

Hedefinizin argüman için ne olduğuna bağlıdır. Boş bir liste, bir varsayılan argüman için daha açık uygulamalara sahip olacaktır (en azından listeyi bir şekilde değiştirenler), ancak boş bir değişmez tuple, herhangi bir argümanın verilmediğinin yanı sıra, herhangi bir sezgisel kullanım gerektirmeyecektir.

def foo(a, b=None): 
İlgili konular