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.