[python] Prepis videa -- druha cast (bylo Guido video)

Petr Prikryl PrikrylP na skil.cz
Pátek Březen 10 14:00:54 CET 2006


...narychlo druhá část (tady už to dělám trochu pečlivěji,
než první část). Základní informace jsem slepil z obsahu
prezentovaných slajdů. Zkoušel jsem to opsat přesně, ale
slajdy přes video nejsou nejlépe čitelné, takže tam můžou
být chyby například v číslech PEP. Do hranatých závorek
dávám vlastní poznámky.

Zdroj (10.3.2006): "Google New York's Technical Speaker Series."

Guido van Rossum přednáší v prostorách firmy Google ve
středu 22. února 2006.

http://video.google.com/videoplay?docid=60331183357868340


Python 2.5
==========
- alfa verze v květnu, release v září
  * alfa 1: 6. května 2006
  * alfa 2: 3. června 2006
  * alfa 3: 1. července 2006
  * beta 1: 29. července 2006
  * beta 2: 26. srpna 2006
  * rc 1:   16. září 2006
  * finální verze: 30. září 2006
  Může se to dokonce ještě urychlit.

- větev 2.4 taky není zatím mrtvá
  * 2.4.3 bude uvolněna před 2.5a1
  * 2.4.4 zhruba jako finální 2.5

Co tam bude nového
==================
- Jazyk
  * absolutní/relativní import (PEP 328)
  * podmíněné výrazy (*PEP 308)
  * try/except/finally znovu spojenci (PEP 341)
  * výrazy s yield a vylepšení generátorů (PEP 342)
  * příkaz with (*PEP 343)
  * revidované výjimky (*PEP 352)
  * __index__ (*PEP 357)

- Implementace
  * AST překladač [Abstract Syntax Tree]
  * velikost objektů bude vyjádřena typem ssize_t
    místo int (PEP 353)
  * vylepšení volby -m (*PEP 338)

(*) [nečitelná poznámka]

- Knihovna
  * any()/all()
  * ElementTree
  * a další


Absolutní/relativní import
==========================
    
Někdy nastanou situace, kdy jméno interního modulu (uvnitř
balíčku, tedy podadresáře) koliduje s jménem standardního
modulu. Podle pravidel se nejdříve hledá interní modul, což
ale brání možnosti použití standardního modulu.

Řešení spočívá v oddělení syntaxe pro absolutní a relativní
import. Nová syntaxe vede k zpětné nekompatibilitě, takže se
bude povolovat explicitně přes __future__. Příklady:

 import foo            # hledá se JEN v sys.path
 from . import foo     # hledá se JEN v aktuálním balíku
 from .. import foo    # hledá se v rodičovském balíku
 from .bar import foo  # hledá se v balíku bar
 from ..bar import foo # hledá se v sourozenci balíku bar [tomu moc nerozumím]

 atd. Povolen je libovolný počet úvodních teček.


Podmíněné výrazy
================
- Debatovalo se o tom před pár lety. Problematika znovu
  otevřena. Používání obratu "PODMÍNKA and VÝRAZ1 or VÝRAZ2"
  vede k chybám při VÝRAZ1 vyhodnocený jako False.
- GvR navrhuje "VÝRAZ1 if PODMÍNKA else VÝRAZ2"
- Odmítnuta celá řada alternativ. (C styl je považován za
  příliš kryptický, přidávání dalších klíčových slov se také
  nezvažuje.)
- Doporučuje se používat zřídka. Používání klasické
  konstrukce if/else je často lepší. 

try/except/finally znovu spojenci
=================================

Momentálně nelze používat finally a except dohromady. GvR
měl kdysi potíže s implementací a současné použití se mu
jevilo v některých případech nejednoznačné. Java ukázala, že
tam žádná nejednoznačnost není.

Kdysi dříve Python konstrukci

  try:
      BLOK1
  except:
      BLOK2
  finally:
      BLOK3

... umožňoval, ale tato možnost byla u novějších verzí
odstraněna. Po revizi bude tento syntaktický zápis znovu
povolen.


Vylepšení generátorů
====================

Inspirace případy použití generátorů pro vstup/výstupní
operace. Inspirace jazykem Ruby.

- yield může být použit jako výraz
- yield bez argumentu je totéž jako "yield None"
- g.send(hodnota) zašle generátoru hodnotu
- g.throw(výjimka) vyvolá výjimku [v kontextu použití yield]
- g.close() vyvolá GeneratorExit (a odchytí si ji)
- když se generátor dostane do pařátů garbage collectoru, 
  provede se close()
- yield [zatím] nelze použít uvnitř try/finally


with
====

Netriviální záležitost, trocha magie; with jako blok,
správce kontextu (@contextmanager), zpracování výjimek.

Mutex jako inspirace i jako první kandidát pro využití with.


Revidované výjimky
==================

- Standardní výjimky se stanou třídami nového typu.
- Nová kořenová třída: BaseException
  * Stane se bázovou třídou pro KeyboardInterrupt a SystemExit.
    (Existují dobré důvody, proč tyto dvě výjimky nemají mít
    bázovou třídu Exception, ale právě BaseException.)
  * Stane se bázobou třídou také pro Exception a vše pod
    touto třídou.
- Ve verzích po 2.5
  * budou zakázány výjimky používající řetězce
  * všechny výjimky musí dědit z BaseException
  * Možná bude odstraněna holá forma příkazu "except:"
  * Cíle bude možné dosáhnout až během několika meziverzí.

__index__
=========

Nový protokol: "Pokud objekt reprezentuje index v
nestandardní reprezentaci, pak __index__() převádí tuto
nestandardní reprezentaci na standardní integer". Motivace
pochází s oblasti numerických výpočtů.


Překladač založený na abstraktních syntaktických stromech
=========================================================

Týká se vlastností implementace, nikoliv vlastností jazyka. 

Téměř se ho podařilo vypustit už v souvislosti s 2.4, ale
nebyl doladěný a blížil se naplánovaný termín vypuštění
verze. 

* Co to je?
  - zcela nový překladač bajtkódu
  - používá ABSTRAKTNÍ syntaktické stromy místo KONKRÉTNÍCH
  
* Proč?  
  - nový překladač se snadněji upravuje
    (užitečnost se již prokázala při úpravách try/except/finally)
  - ke strukturám AST lze přistupovat i s pythonovského kódu
    To znamená, že lze přímo prostřednicvím pythonovského
    kódu experimentovat z modifikacemi bajtkódu, pokusně
    vytvářet nové varianty jazyka a podobně. 
    
    
ssize_t
=======

Opět záležitost implementace. ssize_t odpovídá celočíselnému
znaménkovému typu, který zabírá stejný počet bajtů jako
ukazatel v jazyce C. To znamená, že například u 64bitového
kódu reprezentuje větší čísla, než typ long v jazyce C.


-m <package>.<module>
=====================

Přímé spuštění modulu v balíku. Využije se například při
spouštění regresních testů Pythonu, které jsou součástí jeho
zdrojových textů.


Novinky v knihovně 2.5
======================

* Nové zabudované funkce: any(), all()
  * if any(x > 0 for x in S):  ...
  * if all(P(x) for x in S): ...
  * Umožňují používat generátorové výrazy
    - ale pracují s libovolnými iterátory a iterable
  * Sémantika zkrácených výrazů (jako u and/or operátorů)
    - Zastaví při prvním nevyhovujícím případu,
    - ale nevyhovující případ není zpřístupněn, [protože]
    - vedlo by to k mnoha podivnostem...
      * all() by muselo vracet True nebo případ, který vede
        k false.
        
* Nové moduly:
  - funkcional: partial()
  - hashlib: MD-5, SHA-1, -224, -256, -384, -512
  - cProfile: lepší profiler, rychlejší, menší režie
  - [c]ElementTree: lepší XML API 
    * Fredrik Lundh, třetí strana
    * ElementTree implementován v Pythonu
    * cElementTree je rychlejší
    * from xmlcore.etree import ElementTree
  
* Doufejme, že také:
  - ctypes: volání libovolného C kódu z DLL nebo sdílené
            knihovny (sharelib)
  - wstiref [?]: infrastruktura pro standardní web framework
  - setuptools: snadná správa balíků
  - bdist_msi, bdist_deb?, bdist_egg???: pro distutils
  

(konec)

pepr

Jan Suchý
> Ahoj, tady je Guido naživo z konference Python in New York 
> konané 22.2.2006.
> V prvním videu mluví o vzniku jazyka a cílech návrhu, v 
> druhém podrobně 
> o změnách, které budou ve verzi Pythonu 2.5 a 3.0, včetně 
> předpokládaného data uvedení nové verze 2.5.
> tak si o užijte :-)
> 
> http://video.google.com/videoplay?docid=-7758421725489622662
> http://video.google.com/videoplay?docid=60331183357868340
pepr

Jan Suchý
> Ahoj, tady je Guido naživo z konference Python in New York 
> konané 22.2.2006.
> V prvním videu mluví o vzniku jazyka a cílech návrhu, v 
> druhém podrobně 
> o změnách, které budou ve verzi Pythonu 2.5 a 3.0, včetně 
> předpokládaného data uvedení nové verze 2.5.
> tak si o užijte :-)
> 
> http://video.google.com/videoplay?docid=-7758421725489622662
> http://video.google.com/videoplay?docid=60331183357868340


Další informace o konferenci Python