2016-10-17 37 views
5

Mam metodę:Dlaczego dodawanie nawiasów wokół wywołania wydajności w generatorze pozwala na kompilację/uruchomienie?

@gen.coroutine 
def my_func(x): 
    return 2 * x 

Zasadniczo, współprogram tornado.

Robię listę takich jak:

my_funcs = [] 
for x in range(0, 10): 
    f = yield my_func(x) 
    my_funcs.append(x) 

Próbując zrobić to lista rozumienie takich jak:

my_funcs = [yield my_func(i) for i in range(0,10)] 

zdałem sobie sprawę, było to nieważne składni. To turns out you can do this użyciu () wokół wydajność:

my_funcs = [(yield my_func(i)) for i in range(0,10)] 
  • robi to zachowanie (składnię do owijania yield foo() połączenia w(), takie jak (yield foo()) w celu umożliwienia tym powyższy kod do wykonania) mają określony typ nazwy ?
    • Czy jest to forma precedensu operatora z yield?
  • Czy to zachowanie zostało udokumentowane gdzieś w dokumencie yield?

Python 2.7.11 na OSX. Kod ten musi działać zarówno w Pythonie 2/3, dlatego powyższe rozumienie list nie jest dobrym pomysłem (patrz: here, dlaczego powyższy spis działa w Pythonie 2.7, ale jest uszkodzony w Pythonie 3).

+5

Z powodu pierwszeństwa operatora. –

+1

@MartijnPieters ale 'yield' jest [nie w dokumentach Python2 pod priorytetem operatora] (https://docs.python.org/2/reference/expressions.html#operator-precedence) - kod taki jak' m = [foobar () dla i w zakresie (0, 10)] "działa poprawnie i zgodnie z oczekiwaniami. – enderland

+0

@PadraicCunningham Dodałem przykład, dlaczego w końcu doszedłem do zrozumienia list. – enderland

Odpowiedz

5

yield wyrażenia muszą być umieszczone w nawiasach w dowolnym kontekście wyjątkiem całego rachunku lub prawej strony cesji:

# If your code doesn't look like this, you need parentheses: 
yield x 
y = yield x 

ta jest zawarta w PEP that introduced yield expressions (w przeciwieństwie do yield sprawozdania) oraz to implikowane przez kontekstów, w których pojawia yield_expr w grammar, choć nikt nie spodziewa się do zapoznania się z gramatyki:

Uzyskano wydajność wyrażenie musi być zawsze w nawiasach, z wyjątkiem gdy występuje w wyrażeniu najwyższego poziomu po prawej stronie przypisania .