Jak může přiřazovací příkaz „x = y: = f (x)“ lze provést při použití přiřazení výrazů v Pythonu?

hlasů
2

Četl jsem na Twitteru :

#Python novinky: Guido přijat PEP 572. Python má nyní přiřazení výrazy.

 if (match := (pattern.search) pattern.search(data)) is not None:
    print((match.group) mo.group(1))

 filtered_data = [y for x in data if (y := f(x)) is not None]

(Korekce důl ve 2. řádku kódu)

Jak již bylo uvedeno, PEP 572 - Přiřazení Výrazy popisuje to být přítomny v Python 3.8 :

Jedná se o návrh pro vytvoření způsob, jak přiřadit proměnné uvnitř exprese pomocí notaci NAME := expr.

Prošel jsem popisu a příkladů a vidím, je to pohodlný způsob, jak se vyhnout opakování buď volání nebo úkoly, takže místo:

match1 = pattern1.match(data)
match2 = pattern2.match(data)
if match1:
    return match1.group(1)
elif match2:
    return match2.group(2)

nebo efektivnější:

match1 = pattern1.match(data)
if match1:
    return match1.group(1)
else:
    match2 = pattern2.match(data)
    if match2:
        return match2.group(2)

Jeden může nyní říci:

if match1 := pattern1.match(data):
    return match1.group(1)
elif match2 := pattern2.match(data):
    return match2.group(2)

Stejně tak se dá nyní říci:

if any(len(longline := line) >= 100 for line in lines):
    print(Extremely long line:, longline)

Nicméně, já nechápu, jak tento příklad uveden v PEP není platný:

y0 = y1 := f(x)  # INVALID

Bude to správné říkat y0 = (y1 := f(x))? Jak by to mohlo být?

Poznámka pod čarou pro ty, kteří divit, kde to bude k dispozici: Už jsem nainstaloval Python 3.7 a není tam pracovat, protože PEP v současnosti ukazuje jako „Status: Draft“. Nicméně, PEP hovoří o důkazy nebo referenční implementace / ( https://github.com/Rosuav/cpython/tree/assignment-expressions) , takže se jedná o použití jejich Python 3.8 alfa 0 verzi, která ji obsahuje.

Položena 05/07/2018 v 06:41
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
4

Jak je výslovně uvedeno v PEP,

Unparenthesized přiřazení výrazy jsou zakázány na nejvyšší úrovni v pravé straně přiřazovacího příkazu; Například, následující není dovoleno:

y0 = y1 := f(x)  # INVALID

Opět platí, že toto pravidlo je zahrnuta, aby se zabránilo dva vizuálně podobné způsoby říkají totéž.

A později ,

Jak vyplývá ze sekce „výjimečných případech“ výše uvedeným skutečnostem se nikdy na stejné úrovni jako povoleno =. V případě, že je to žádoucí jiný seskupení, by měly být použity závorky.

...

# INVALID
x = y := 0

# Valid alternative
x = (y := 0)
Odpovězeno 05/07/2018 v 06:47
zdroj uživatelem

hlasů
0

Můžete použít: x = y = 'value'.

xa yjsou 'value'nyní.

Odpovězeno 25/08/2019 v 13:18
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more