Python TypeError: biçim dizesi için yeterli bağımsız değişken yok


138

İşte çıktı. Bunlar inandığım utf-8 dizgeleri ... Bunlardan bazıları NoneType olabilir ama hemen başarısız oluyor, bunun gibi olanlardan önce ...

instr = "'%s', '%s', '%d', '%s', '%s', '%s', '%s'" % softname, procversion, int(percent), exe, description, company, procurl

TypeError: biçim dizesi için yeterli bağımsız değişken yok

Yine de 7'ye 7?

Yanıtlar:


177

%Dizeleri biçimlendirmek için sözdiziminin güncelliğini yitirdiğine dikkat edin. Python sürümünüz destekliyorsa, şunu yazmalısınız:

instr = "'{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}'".format(softname, procversion, int(percent), exe, description, company, procurl)

Bu aynı zamanda sahip olduğunuz hatayı da düzeltir.


Bu, günlük kaydı modülü için de çalışıyor mu? Bu tür bir enterpolasyon onun tarafından anlaşılıyor mu?
AllTradesJack

@joshsvoss: evet, burada olasılıkları tartışan birkaç bağlantı var: bugs.python.org/issue14031
Simeon Visser

4
@SimeonVisser, bu neden modası geçmiş oluyor? Örneğin, biçim dizesini saklamak için bir değişken kullanırsanız ve aynı değişkene değiştirilen değerlerle dizeyi koymak isterseniz, biçim_dizesi% = ('bla', 'bla', 'bla') ile biraz daha temiz bir kod elde edersiniz. . Bu konuda ayrıntılı bilgi vermek veya bazı yararlı bağlantılara işaret etmek ister misiniz?
Djuka

.format (), bu oldukça yaygın olduğu ve bir operatörün yapmasını gerektirmediği için eklendi. Örneğiniz güzel ama yeni gelen birine açıklaması zor. A = a.format (1,2,3) gösterimi çok daha açık ve anlaşılması / öğretilmesi daha kolaydır. Bir bağlantım yok, ancak format () kullanılmasının ana nedeni budur (anlama kolaylığı).
Simeon Visser

1
Ayrıca format (), "{a} {b}". Format (a = '3', b = '4') gibi olanları ifade etmenin daha açık yollarını destekler.
Simeon Visser

240

Biçim bağımsız değişkenlerini bir demete koymanız gerekir (parantez ekleyin):

instr = "'%s', '%s', '%d', '%s', '%s', '%s', '%s'" % (softname, procversion, int(percent), exe, description, company, procurl)

Şu anda sahip olduğunuz şey aşağıdakilere eşdeğerdir:

intstr = ("'%s', '%s', '%d', '%s', '%s', '%s', '%s'" % softname), procversion, int(percent), exe, description, company, procurl

Misal:

>>> "%s %s" % 'hello', 'world'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string
>>> "%s %s" % ('hello', 'world')
'hello world'

3
Bu işe yaradı ... sıralı. NoneType hatasını önlemek için% s biçimlendirmesini kullanmaya çalışıyordum ama hala alıyorum. İlgili: stackoverflow.com/questions/1338690/…
y2k

Yaş göz önüne alındığında, OP için yararlı olmayacak, ancak yine de birisi için yararlı olması durumunda: Bir değişkenin yok olabileceği basit bir çözüm, üçlü bir ifade ile buna karşı korunmaktır - yani "% s% s"% ( a eğer a başka biri değilse "", b) bir olasılıkla Hiçbiri olma konusunda endişeliysek. Dolayısıyla, a Hiçbiri olsa bile, yine de Hiçbiri biçim operatörüne aktarmıyoruz ve sorunlara neden olmuyoruz.
Blair

21

%Biçim dizemde yüzde karakteri olarak kullanırken aynı hatayı aldım . Bunun çözümü %%,.


4
Çözümünüzün nasıl çalıştığına ve çözüm olmadan nasıl başarısız olacağına vb. Dair bazı kod örnekleri sağlamak faydalı olabilir. Bkz Ben iyi cevap yazmak nasıl? . Bunun 5 yıllık bir soru olduğunu unutmayın, bu nedenle, yalnızca zaten orada bulunanlardan önemli ölçüde daha fazla bilgi sağlıyorsa bir yanıt eklemelisiniz.
Ramon

Yazım hatası nedeniyle bu hatanın bir varyasyonunu aldım:"foo: %(foo)s, bar: s(bar)% baz: %(baz)s" % {"foo": "FOO", "bar": "BAR", "baz": "BAZ"}
Akavall

Python3 için bu "çözüm" yanlış -> Geçersiz sözdizimi
JonyD
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.