Jaký je Python „s“ prohlášením používá?

hlasů
4

Snažím se pochopit s prohlášením v pythonu. Všude, kam se podíváte, že mluví o otevření a zavření souboru, a je určena k nahrazení try-finally. Mohl by někdo po nějaké další příklady taky. Jen se snažím se baňku a jsou s výroky habaděj v něm. Rozhodně požádat někoho, kdo by poskytovat některé jasnost na něm.

Položena 28/09/2010 v 15:37
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
9

Je tu velmi pěkné vysvětlení zde . Zjednodušeně řečeno, s prohlášením volá dvě speciální metody na přidružené objektu. Tyto __enter__ a __exit__ metody. Způsob zadání vrací proměnnou spojenou s „s“ prohlášení. Zatímco metoda __exit__ je volána po prohlášení provede zvládnout jakoukoliv vyčištění (například uzavírání ukazatel souboru).

Odpovězeno 28/09/2010 v 15:42
zdroj uživatelem

hlasů
9

Myšlenka withprohlášení je, aby se „dělat správnou věc“ Cesta nejmenšího odporu. Zatímco například soubor je nejjednodušší, závitové zámky skutečně poskytují více klasický příklad non-samozřejmě kočárek kód:

try:
    lock.acquire()
    # do stuff
finally:
    lock.release()

Tento kód je přerušeno - v případě, že získávání blokování někdy selže, bude buď špatně výjimku být vyvolána (protože kód se pokusí uvolnit zámek, který nikdy získal), nebo ještě hůře, pokud se jedná o rekurzivní zámek, to bude uvolněna brzy. Správný kód vypadá takto:

lock.acquire()
try:
    # do stuff
finally:
    # If lock.acquire() fails, this *doesn't* run
    lock.release()

Pomocí withpříkazu, je nemožné, aby si to špatně, protože je postaven na správce kontextu:

with lock: # The lock *knows* how to correctly handle acquisition and release
  # do stuff

Jiné místo, kde se withtvrzení značně pomáhá je podobný hlavní prospěch funkce a třídy dekorace: to znamená „dvoudílný“ kód, který může být od sebe odděleny libovolným počtem řádků kódu (definice funkce pro natěrače, The tryblok v aktuální případ) a udělá z něj „z jednoho kusu“ kódu, kde programátor jednoduše deklaruje dopředu, co se snažíte udělat.

U krátkých příkladů, to nevypadá jako velký zisk, ale ve skutečnosti je obrovský rozdíl, když revizi kódu. Když vidím lock.acquire()v kusu kódu, musím posunout dolů a zkontrolujte, zda odpovídající lock.release(). Když vidím with lock:, i když není nutná žádná taková kontrola - vidím okamžitě, že zámek bude správně uvolněna.

Odpovězeno 08/02/2011 v 08:44
zdroj uživatelem

hlasů
1

Je jich tam dvanáct příklady použití withv PEP343 , včetně souborů otevřených například:

  1. Šablona pro zajištění toho, že zámek, získané na začátku bloku, se uvolní, když je blok vlevo
  2. Šablona pro otevření souboru, který zajišťuje, že soubor je uzavřen, když je blok vlevo
  3. Šablona k páchání nebo vrácení transakce databáze
  4. Příklad 1 přepsána bez generátoru
  5. Přesměrovat stdout dočasně
  6. Varianta na otevřený (), který také vrátí chybovou podmínku
  7. Další užitečnou Příkladem může být operace, který blokuje signály
  8. Další využití pro tuto funkci je Desetinné kontext
  9. Zde je jednoduchý kontext manažer desetinné modulu
  10. Obecný „objektově-zavírání“ kontext manager
  11. uvolněný () kontext dočasně uvolnit dříve nabyté zámek tím, že vymění Acquire () a uvolnění () volání
  12. A „vnořené“ kontext manažer, který automaticky Hnízdí dodané kontexty zleva do prava, aby nedocházelo k nadměrnému odsazení
Odpovězeno 01/08/2011 v 02:18
zdroj uživatelem

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