Yanıtlar:
Mark Cidade'nin cevabı doğru - bir demet sağlamanız gerekiyor.
Ancak Python 2.6 den itibaren kullanabileceğiniz format
yerine %
:
'{0} in {1}'.format(unicode(self.author,'utf-8'), unicode(self.publication,'utf-8'))
%
Dizeleri biçimlendirmek için kullanımı artık desteklenmemektedir.
Bu dize biçimlendirme yöntemi, Python 3.0'daki yeni standarttır ve yeni kodda Dize Biçimlendirme İşlemleri'nde açıklanan% biçimlendirmesine tercih edilmelidir.
Birden fazla argüman kullanıyorsanız bunun bir demet halinde olması gerekir (ekstra parantezlere dikkat edin):
'%s in %s' % (unicode(self.author), unicode(self.publication))
EOL'nin işaret ettiği gibi, unicode()
işlev genellikle ascii kodlamasını varsayılan olarak kabul eder, bu nedenle ASCII olmayan karakterleriniz varsa, kodlamayı açıkça geçmek daha güvenlidir:
'%s in %s' % (unicode(self.author,'utf-8'), unicode(self.publication('utf-8')))
Python 3.0'dan itibaren, str.format()
sözdizimini kullanmak tercih edilir :
'{0} in {1}'.format(unicode(self.author,'utf-8'),unicode(self.publication,'utf-8'))
format
Aşağıdakiler dokümantasyondan alıntıdır:
Verilen
format % values
,%
dönüşüm özellikleri içindeformat
sıfır veya daha fazla unsurları ile değiştirilirvalues
. Etki,sprintf()
C dilinde kullanıma benzer .Eğer
format
tek bir argüman gerektirir değerleri olmayan tek bir kayıt düzeni bir nesne olabilir. Aksi takdirde, değerler tarafından belirtilen öğelerin tam sayı ile bir tanımlama grubu olmalıdırformat
dize , ya da tek bir eşleme nesnesi (örneğin, bir sözlük).
str.format
yerine%
%
Operatöre daha yeni bir alternatif kullanmaktır str.format
. İşte belgelerden bir alıntı:
str.format(*args, **kwargs)
Bir dize biçimlendirme işlemi gerçekleştirin. Bu yöntemin çağrıldığı dize, hazır metinler veya kaşlı ayraçlarla ayrılmış değiştirme alanları içerebilir
{}
. Her değiştirme alanı, konum bağımsız değişkeninin sayısal dizinini veya bir anahtar kelime bağımsız değişkeninin adını içerir. Her değiştirme alanının karşılık gelen bağımsız değişkenin dize değeri ile değiştirildiği dizenin bir kopyasını döndürür.Bu yöntem Python 3.0'daki yeni standarttır ve
%
biçimlendirmeye tercih edilmelidir .
İşte bazı kullanım örnekleri:
>>> '%s for %s' % ("tit", "tat")
tit for tat
>>> '{} and {}'.format("chicken", "waffles")
chicken and waffles
>>> '%(last)s, %(first)s %(last)s' % {'first': "James", 'last': "Bond"}
Bond, James Bond
>>> '{last}, {first} {last}'.format(first="James", last="Bond")
Bond, James Bond
'{self.author} in {self.publication}'.format(self=self)
"çalışması" gerektiğini düşündürmektedir . Her şeyden emin değilim unicode
.
{first[0]}
almak için kullanılmış olabilirsiniz J
.
Değerleri parantez içine almanız yeterlidir:
'%s in %s' % (unicode(self.author), unicode(self.publication))
Burada, ilk kez yer alacaktır. Ve saniye , kullanılacaktır.%s
unicode(self.author)
%s
unicode(self.publication)
Not: iyilik etmelidir
string formatting
üzerinde%
Notation'ý. Daha fazla bilgi burada
%s
o zaman önermek inanamıyorumformat
Şimdiye kadar gönderilen cevapların bazılarında önemli bir sorun var: unicode()
varsayılan kodlamanın kodunu çözer, bu genellikle ASCII'dir; aslında, unicode()
verilen baytları karakterlere dönüştürerek "anlamlandırmaya" çalışır. Bu nedenle, esasen önceki yanıtlar tarafından önerilen aşağıdaki kod, makinemde başarısız oluyor:
# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))
verir:
Traceback (most recent call last):
File "test.py", line 3, in <module>
print '{0}'.format(unicode(author))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Hata author
, yalnızca ASCII bayt içermemesi (yani [0; 127] içindeki değerlerle) ve unicode()
varsayılan olarak ASCII'den (birçok makinede) kod çözülmesinden kaynaklanır.
Sağlam bir çözüm, alanlarınızda kullanılan kodlamayı açıkça vermektir; UTF-8'i örnek olarak alarak:
u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))
(veya u
Unicode sonucunu veya bayt dizesini isteyip istemediğinize bağlı olarak , ilk harf olmadan ).
Bu noktada, biçimlendirme sırasında kodu çözmek yerine author
ve publication
alanlarının Unicode dizeleri olmasını düşünmek isteyebilirsiniz .
Python2 için bunu da yapabilirsiniz
'%(author)s in %(publication)s'%{'author':unicode(self.author),
'publication':unicode(self.publication)}
yerine koymak için çok fazla argümanınız varsa (özellikle uluslararasılaştırma yapıyorsanız)
Python2.6 ve sonraki sürümler .format()
'{author} in {publication}'.format(author=self.author,
publication=self.publication)
Tamlık için, python 3.6'da PEP-498'de f-string eklenmiştir . Bu dizeler sayesinde
minimal bir sözdizimi kullanarak ifadeleri dize değişmezlerinin içine yerleştirir.
Bu, örneğiniz için şunları da kullanabileceğiniz anlamına gelir:
f'{self.author} in {self.publication}'
'{} in {}'
biçimli bir dize kullanabilir.