Już od jakiegoś czasu deweloperzy Pythona przygotowują nową, niekompatybilną z poprzednimi, wersję Pythona. Python, gdyby ktoś nie wiedział, to jeden z najfajniejszych języków jakie wymyślono ;) (oczywiście to mocno subiektywne uczucie, ale może kogoś zachęci ;) ). Napiszę tutaj o dwóch ważnych zmianach, co do których nie byłem zupełnie przekonany (a konkretnie: w ogóle nie byłem przekonany), a które spodobały mi się po dzisiejszej krótkiej zabawie z wersją alpha3 Pythona 3000 :)

Jedną z tych zmian jest wycofanie konstrukcji językowej, jaką był print. Został on zastąpiony funkcją o dość nietypowej, zaskakującej nazwie, jaką jest print() ;) Czym się różnią?

Konstrukcja print była zupełnie niekonfigurowalna. Zawsze łączył podane elementy znakiem spacji, prawie zawsze na końcu sam dodawał znak nowej linii… Jedyną sensowną metodą naprawy tego było ręczne pisanie do sys.stdout, co do ładnych rozwiązań nie należało. Funkcja print() rozwiązuje ten problem za pomocą parametrów nazwanych, do których należą m.in. sep i end. Pierwszy odpowiada za separator parametrów, a drugi za znak dodawany na końcu konstrukcji. Czyli jeśli mamy do wyświetlenia 3 elementy, które chcemy rozdzielić znakiem wykrzyknika, a zakończyć znakiem hasza, w Pythonie 2.x zrobilibyśmy np.:

print '!'.join ('a', 's', 'd')+'#',

lub:

print 'a' + '!' + 's' + '!' + 'd' + '#',

W Pythonie 3000 będzie to wyglądało nieco ładniej:

print ('a', 's', 'd', sep='!', end='#')

W Pythonie 2.x można było także skorzystać z alternatywnej składni, która pozwalała nam pisać do dowolnego ‘uchwytu’ (np. otworzonego pliku, ja często z tego korzystałem przy wypisywaniu błędów na STDERR):

print >>sys.stderr, "komunikat błędu"

W nowej wersji składnia tego typu jest niedostępna, zamiast tego jest inny parametr nazwany: file:

print ("komunikat błędu", file=sys.stderr)

Druga z rzeczy które chciałbym pokazać to formatowanie tekstu. Do tej pory można było korzystać ze składni “z procentem”:

print 'liczba całkowita: %d, liczba zmiennoprzecinkowa: %0.1f' % (3.14, 3.14)

Ta składnia w Pythonie 3000 nie będzie już obsługiwana, zamiast tego wszystkie obiekty typu string dostały nową metodę: .format(). Metoda ta umożliwia znacznie bardziej rozbudowane formatowanie i konwersję podawanych parametrów, niż do tej pory było to możliwe za pomocą składni “procentowej”. Dajmy na to taki przykład:

class mysz:
  def __init__ (self):
    self.fname = 'Marcin'
    self.lname = 'Sztolcman'
    self.nname = 'MySZ'
    self.age = 28
    self.city = 'Szczecin'
  def __str__ (self):
    return '{0.fname} {0.nname:_^10} {0.lname}'.format (self)

print ('Jestem {0}, mam {0.age} lat, i mieszkam w mieście {0.city}.'.format (mysz ()))

Przykład jest może nieco infantylny ;) ale pokazuje to co chciałem pokazać: zaawansowane możliwości formatowania tekstu, jakich użycza nam metoda .format(). Powyższy przykład powinien nam wyświetlić:

Jestem Marcin ___MySZ___ Sztolcman, mam 28 lat, i mieszkam w mieście Szczecin.

Pełna składnia i format napisów formatujących opisany jest w Pythonowym manualu: docs.python.org/dev/3.0/library/string.html#format-string-syntax. Ja powiem tylko że po tym jak troszę się tym pobawiłem, zrozumiałem powody rezygnacji z mojej naprawdę bardzo lubianej składni, jak ją nazwałem, “procentowej” na rzecz .format() :)

Oczywiście Python 3000 wprowadza znacznie więcej zmian i nowości, być może jeszcze kilka z nich opiszę niedługo na łamach tegoż bloga (obiecuję że się postaram ;) ).


Liczba komentarzy: 2

  1. 1 Był piątek, 07 marzec 2008 roku gdy o godzinie 14:59 przyszedł Aras i stwierdził:

    czy ja wiem…

  2. 2 Był piątek, 07 marzec 2008 roku gdy o godzinie 20:52 przyszedł MySZ i stwierdził:

    @Aras: a czego konkretnie nie wiesz ? ;)

A Ty? Co o tym myślisz?

Możesz używać w komentarzach następujących znaczników:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Sblam! Antyspam