2008-12-06 10 views
7

Po prostu natknąłem się na ten idiom w jakimś Pythonie z otwartym kodem źródłowym, i zakrztusiłem się drinkiem.Czy ten idiom jest pythonic? (someBool i "True Result" lub "False Result")

Zamiast:

if isUp: 
    return "Up" 
else: 
    return "Down" 

lub nawet:

return "Up" if isUp else "Down" 

kod przeczytać:

return isUp and "Up" or "Down" 

widzę to ten sam wynik, ale jest to typowa idiom w języku Python? Jeśli tak, to czy jakiś hack wydajności działa szybko? Czy jest to jednorazowy egzemplarz, który wymaga przeglądu kodu?

Odpowiedz

17

Idiom "a i b lub c" był kanonicznym sposobem wyrażania arytmetyki trójskładnikowej, jeśli w języku Python przed napisaniem i zaimplementowaniem wersji PEP 308. Ten idiom zawodzi, odpowiedź "b" jest fałszywa; wspierać ogólnym przypadku można napisać

return (a and [b] or [c])[0] 

alternatywny sposób pisowni było

return (b,c)[not a] 

który, wraz z wprowadzeniem typu bool, mogą być zapisane jako

return (c,b)[bool(a)] 

(w przypadku, gdy nie jest to jasne: konwersja na wartość bool, a nie operator, jest konieczna, jeśli nie jest już znana funkcja bool)

Dzisiaj należy użyć składni wyrażenia warunkowego, jeśli rzecz musi być wyrażeniem; w innym przypadku polecam użyć instrukcji if.

+4

Alternatywna składnia ma jedną różnicę w stosunku do metody i/lub operatora trójskładnikowego - obie wartości są zawsze oceniane. Nie jest to wielka sprawa, jeśli są to tylko zmienne, ale jeśli są tam wywołania funkcji (szczególnie z efektami ubocznymi), będzie to miało znaczenie. – Brian

0

Ten kod jest dla mnie godny zaufania, ale sądzę, że nie ma w tym nic złego. Myślę, że tak naprawdę jest to tylko przypadek "spraw, by wszystko pasowało do jednej linii".

Ja osobiście wybrałbym pierwszą formę.

-1

Nie, nie jest.

Jakiś czas temu miałem jakiś similar question.

jeśli konstrukt

val if cond else alt 

nie było bardzo mile widziane (przynajmniej przez społeczność SO) i preferowana była:

if cond: 
    val 
else: 
    alt 

można uzyskać własne wnioski. :)

-1

Yikes. W ogóle nieczytelne. Dla mnie pythonic oznacza łatwy do odczytania.

return isUp and "Up" or "Down" 

Brzmi, co można zrobić w Perlu.

9

Powinieneś przeczytać Using the and-or trick (sekcja 4.6.1) z Dive Into Python przez Mark Pilgrim.Okazuje się, że i - lub sztuczka ma poważne pułapki, o których powinieneś wiedzieć.

Powiązane problemy