2008-09-01 11 views
57

Dizeye bir şey yapmam gereken bir işlev var. İşlemin başarılı olup olmadığını belirten bir boole döndürme işlevine ihtiyacım var ve değiştirilen dizgiyi de döndürmem gerekiyor.Python'daki bir işlevden birden çok değer döndürmenin en iyi yolu nedir?

C# 'de, string için bir out parametresi kullanırdım, ancak Python'da eşdeğer bir değer yoktur. Python için hala çok yeni ve düşünebildiğim tek şey, boole ve değiştirilmiş dizeyle bir tuple dönmek.

İlgili soru: Is it pythonic for a function to return multiple values?

+0

İlgili soruya bir bağlantı ekledim – jfs

cevap

116
def f(in_str): 
    out_str = in_str.upper() 
    return True, out_str # Creates tuple automatically 

succeeded, b = f("a") # Automatic tuple unpacking 
+1

Şimdiki yaklaşımın – Nicholas

7

bir demet dönersek Python bunu yapmanın olağan bir yoldur.

15

Bir tuple döndürün. İşlem başarılı değilse

def f(x): 
    # do stuff 
    return (True, modified_string) 

success, modified_string = f(something) 
+0

Ortağım, çok değer döndürmek istediğinde hava durumu hakkında '(' ve ')' yazmalıyım. Pycharm'da kod yazdığımda, ide, dönüş değerlerinin '()' ile döndüğü satırlardaki yıpranmayı gösterir, ancak pep8'de kod stili kuralını bulamıyoruz. Bununla ilgili ne düşünüyorsun? Teşekkür ederim. –

28

Neden bir özel durum? Kişisel olarak, bir işlevden birden fazla değer döndürmeniz gerekirse, işleri doğru bir şekilde yapıyorsanız veya bir nesneyi kullanırsanız yeniden düşünmelisiniz.

Ama daha doğrudan bir noktaya atıyorsanız, sorunu ele almaya zorlarsınız. Başarısızlığı belirten bir değer döndürmeye çalışırsanız, birisinin değeri kontrol edememesi ve hata ayıklama hatalarıyla sonuçlanması zor olabilir.

+1

Anlaşmalı diziler ve matrislerle çalıştığını eklemek isterim. Pythonic işlevler, biri diğerinden büyük olasılıkla daha yüksek olduğunda "başarı/başarısızlık" belirtmek için kodları döndürmemelidir. Sadece istisnai durumda bir istisna atmak. Bu söyleniyorsa, gerektiğinde bir tuple döndürün: "a, b, c döndür" –

+5

Önemli olmayan hatalar için istisnalar atan işlevleri sevmiyorum. –

+3

Başarısızlık yaygın olduğunda, hata bilgisinin bir tuple geri döndürülmesi iyi bir yaklaşımdır. Örnek, "iyi" bir değer bulmak için test değerleriyle birden çok kez çağırdığınız bir işlev olacaktır, bunun birçok kez başarısız olmasını beklersiniz ve sonunda iyi bir değer bulur. Bu durumda, bir istisnayı yükseltmekten ziyade "sonuç, sebep". – Graham

3

Başarısızlık için bir istisna atmak ilerlemenin iyi bir yoludur ve çok sayıda farklı değer döndürüyorsanız, bir tuple döndürebilirsiniz. Özel bir durum için, genellikle bir ara yaklaşım alırım: değiştirilen dizgeyi başarıya geri döndürür ve başarısızlık durumunda Yok'u döndürür. Başarısızlık için bir NULL işaretçisini döndürmek için yeniden yapılandırılmamış bir C programcısı yeterli.

Daha büyük bir kitaplığın bir parçası olarak kullanılacak ve diğer geliştiriciler tarafından tüketilecek bir rutin yazıyorsam, başarısızlık konusunda bir istisna atarım. Kendi dogfood'ımı yediğimde, muhtemelen farklı tipler getireceğim ve geri dönüşü test edeceğim.

İlgili konular