2009-10-07 17 views
8

Dzisiaj próbowałem używać pyPdf 1.12 w scenariuszu, który napisałem, który jest skierowany do Pythona 2.6. Podczas uruchamiania mojego skryptu, a nawet importowania pyPdf, dostaję skargi dotyczące przestarzałej funkcjonalności (md5-> hashsum, zestawy). Chciałbym dodać łatkę, aby to działało czysto w wersji 2.6, ale wyobrażam sobie, że autor nie chce złamać kompatybilności ze starszymi wersjami (2.5 i wcześniejszymi).Obsługa wielu wersji Pythona w twoim kodzie?

Wyszukiwanie Google i przepełnienie stosu nie przyniosły jak dotąd żadnych rezultatów. Czuję, że widziałem try/except bloki wokół instrukcji import wcześniej osiągnąć coś podobnego, ale nie można znaleźć żadnych przykładów. Czy istnieje ogólnie akceptowana najlepsza praktyka w zakresie obsługi wielu wersji Pythona?

Odpowiedz

10

Istnieją dwa sposoby, aby to zrobić:


(1) Tak jak opisano: Spróbuj czegoś i obejść wyjątkiem dla starszych wersji. Na przykład, można spróbować zaimportować moduł json i importować realizację userland jeśli to się nie powiedzie:

try: 
    import json 
except ImportError: 
    import myutils.myjson as json 

To jest przykład z Django (używają tej techniki często):

try: 
    reversed 
except NameError: 
    from django.utils.itercompat import reversed  # Python 2.3 fallback 

Jeśli iterator reversed jest dostępny, oni go używają. W przeciwnym razie importują własne implementacje z pakietu utils.


(2) jawnie porównać wersję interpretera Pythona:

import sys 
if sys.version_info < (2, 6, 0): 
    # Do stuff for old version... 
else: 
    # Do 2.6+ stuff 

sys.version_info jest krotka, które można łatwo w porównaniu z podobnymi krotki wersji.

0

Wiele wersji Pythona jest obsługiwanych tutaj. Możesz a) warunkowo użyć nowszej wersji, która wymaga trochę pracy, lub b) wyłączyć ostrzeżenia, które powinny być naprawdę domyślne (i jest na nowszych pythonach).