frenzymadness / Advanced_PyLadies

Materiály pro lekce pokročilého Pythonu pro PyLadies Ostrava
Other
8 stars 11 forks source link

Review `else` and `pass` #6

Closed frenzymadness closed 6 years ago

frenzymadness commented 6 years ago

https://github.com/frenzymadness/Advanced_PyLadies/tree/master/02_else_pass_unpacking

@Glutexo z nějakého důvodu tě nemůžu přiřadit k tomuto issue. Nejspíše proto, že jsi ještě neodpověděl na pozvání ke spolupráci na tomto projektu.

encukou commented 6 years ago

Místo except: použij prosím except Exception:. (Pokud se teda nechceš zmínit že except: funguje ale nemělo by se používat.)

encukou commented 6 years ago

Když už vysvětluješ try/except, můžeš vysvetlit i něco jako:

try:
    print('Zkusme dělit nulou ...')
    x = 10 / 0  # !!!
except ArithmeticError:
    print('CHYBA, nějaká aritmetická')
except ZeroDivisionError:
    print('CHYBA: dělení nulou!')
else:
    print('K vyvolání výjimky nedošlo')
finally:
    print('Konec ukázky')
encukou commented 6 years ago

Ten poslední příklad moc to while neukazuje, všechny tři řádky s proměnnou pokusy můžeš nahradit za for pokusy in range(1, 6)...

encukou commented 6 years ago

Napadlo mě tohle (vycházím z toho že while je dobrý když předem nevím kolikrát chci opakovat):

from time import time

# Funkce time() při každém zavolání vrátí aktuální čas v sekundách (od určitého
# pevně daného momentu).
# Chceme skončit po jedné minutě:
cas_konce = time() + 60

while time() < cas_konce:
    odpoved = input('Chceš pokračovat? ')
    if odpoved == 'ano':
        break
    elif odpoved == 'ne':
        exit('Konec')
    else:
        print('Nerozumím odpovědi')
else:
    print('Už se minutu snažíš odpovědět, radši pokračujme')

print('...')
encukou commented 6 years ago

U toho pass bych se možná trochu rozepsal nad variantou .... Mně se líbí takováto konvence:

def funkce_ktera_nikdy_nema_nic_delat():
    pass

def funkce_ktera_jenom_neni_hotova():
    ...

To ... jsem často viděl (a použil) na „live coding“ přednáškách, materiálech a v úkolech pro nedokončený kód, místo kam dopsat řešení či podobnou výpustku.

A pak jsou tu věci, které nejsou hotové ale někdo je chce přesto dát na code review:

def funkce_ktera_neni_hotova_a_dava_to_najevo():
    """Provede složitý distribuovaný výpočet s využitím kvantových jevů"""
    # XXX: dodělat!
    raise NotImplementedError('tohle ještě nejde, plánováno na verzi 3.11')

Často je ale lepší je takovou funkci v kódu vůbec nemít, resp. mít místo ní jen ten TODO komentář, nebo otevřít issue. (Člověk se setká i s raise NotImplementedError(), které by se podle dokumentace takhle nemělo používat.) Edit; doplnil jsem NotImplementedError

Glutexo commented 6 years ago

@encukou Já ti nevím, mně „[…] should raise this exception […] while the class is being developed to indicate that the real implementation still needs to be added.“ přijde jako že by se to tak používat i mělo.

Glutexo commented 6 years ago

@frenzymadness Už by to mělo jít.

encukou commented 6 years ago

Ha, četl jsem to špatně. Celý život žiju v omylu! Díky!

frenzymadness commented 6 years ago

@encukou Děkuji za review. Vše níže zmíněno je v masteru a já jdu na pátek dodělávat poslední část následující lekce.

Místo except: použij prosím except Exception:. (Pokud se teda nechceš zmínit že except: funguje ale nemělo by se používat.)

Opraveno

Když už vysvětluješ try/except, můžeš vysvetlit i něco jako

Doplnil jsem to tam, i když je to materiál primárně o else a tak se mi to tam moc nehodilo. Dal jsem to tedy na konec pod nadpis další úrovně.

Napadlo mě tohle (vycházím z toho že while je dobrý když předem nevím kolikrát chci opakovat):

Nápad s časem je super, ale chtěl bych se vyhnout inputu a tak jsem to předělal na náhodné generování čísel s časovým limitem, takže to při zkoušení nevyžaduje neustálé opakování interakce s uživatelem a dobře to demonstruje onen příklad s neznámým počtem průběhů (a jejich délkou).

U toho pass bych se možná trochu rozepsal nad variantou ...

Nad tím jsem hodně při psaní uvažoval a nakonec jsem se rozhodl to tam nedat. Přečetl jsem o tom několik diskusí, příspěvků a vláken na mailing listech a i když to někteří používají jako náhradu za pass a ani core vývojáři jako Guido to primárně nezavrhli, nebylo to přidáno do jazyka za tímto účelem. Pokud vím, primárním cílem a požadavkem od vývojářů numpy bylo usnadnit indexaci ve vícerozměrných maticích, kde se ... může použít při indexaci/slicování pro vynechání zápisu několika dimenzí. Vím, ničemu to neuškodí, když to v kódu napíšu, ale připadá mi lepší se držet pass, které je k tomuto účelu vytvořeno než používat Ellipsis objekt, který sice vypadá hezky, ale je určen na něco úplně jiného. Tak0 by to mohlo být matoucí, protože zatímco pass se nikde jinde nijak jinak nepoužívá, na Ellipsis je možné narazit právě třeba u numpy. Důležitější než volba správného statementu je beztak komentář, který by ji měl odůvodnit.

Co si o tom myslíš?

frenzymadness commented 6 years ago

Přidal jsem k tomu i materiály o rozbalování sekvencí. Podle této trojice v pátek pojedu.

Glutexo commented 6 years ago

Ode mě dostaneš opět jazykovou korektūru. Mám ji rozdělanou, do pátku ji budeš mít.