2009-04-27 12 views
30

Kiedy uruchomić następujący kod w Pythonie 2.5.2:String formatowanie w wersji Pythona wcześniej niż 2,6

for x in range(1, 11): 
    print '{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x) 

uzyskać:

Traceback (most recent call last): 
    File "<pyshell#9>", line 2, in <module> 
    print '{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x) 
AttributeError: 'str' object has no attribute 'format' 

Nie rozumiem problemu.

Od dir('hello') nie ma atrybutu format.

Jak mogę to rozwiązać?

Odpowiedz

7

Którą wersję Pythona używasz?

Edit dla Pythona 2.5, użyj "x = %s" % (x) (ciągów drukarskich)

Jeśli chcesz drukować inne typy, see here.

+0

Python 2.5.2 ... – user46646

+5

str.format() działa tylko w wersjach 2.6+ i py3k –

8

Wierzę, że jest to funkcja Pythona 3.0, chociaż jest w wersji 2.6. Ale jeśli masz poniżej wersję Pythona, ten typ formatowania ciągów nie zadziała.

Jeśli próbujesz wydrukować ogólnie sformatowane łańcuchy, użyj składni w stylu printf w języku Python za pomocą operatora %. Np

print '%.2f' % some_var 
32

Dla wersji Pythona poniżej 2,6, należy użyć % operator interpolować sekwencję wartości w ciąg formatu:

for x in range(1, 11): 
    print '%2d %3d %4d' % (x, x*x, x*x*x) 

Należy również pamiętać, że operator może interpolować przez nazwy z mapowaniem, zamiast po prostu argumenty pozycyjne:

>>> "%(foo)s %(bar)d" % {'bar': 42, 'foo': "spam", 'baz': None} 
'spam 42' 

w połączeniu z faktem, że wbudowana w Vars() zwraca atrybuty nazw jako mapowanie, może to być bardzo przydatny:

>>> bar = 42 
>>> foo = "spam" 
>>> baz = None 
>>> "%(foo)s %(bar)d" % vars() 
'spam 42' 
+5

Jest to dobry opis, ale nie opisuje sposobu zaimplementowania formatowania w przedstawionym przykładzie. –

7

Mimo istniejącej odpowiedzi opisać przyczyny i punkt w kierunku poprawki, żaden z nich faktycznie zapewnić rozwiązanie, które robi co zadaje pytanie.

Masz dwie opcje rozwiązania problemu. Pierwszym z nich jest aktualizacja do wersji Python 2.6 lub nowszej, która obsługuje format string construct.

Druga opcja to użycie older string formatting with the % operator. Odpowiedni kod tego, co przedstawiłeś, będzie następujący.

for x in range(1,11): 
    print '%2d %3d %4d' % (x, x*x, x*x*x) 

Ten kod snipped wytwarza dokładnie taką samą moc w Pythonie 2.5 jak Twój przykład kodu tworzy w Pythonie 2.6 i wyższej.

Powiązane problemy