2016-03-31 27 views
1

Python'a oldukça yeni geldiğinden emin olduğumdan eminim. Neyse, .format kullanırken geçirebileceğim argüman sayısı için bir sınır var mı? Girişteki çeşitli yerlerde uzun bir girişte varolan sayıları değiştirmesi gereken 8000 sayı listesinin bir listesi var. Şu anda bunu yapmayı planlıyor:Python'da .format için sınırlamalar

text = """ very long input with many {0}..{1}..{8000} in various places """ 
file = open('new_input', 'w') 
file.write(text.format(x,x1,x2,....x8000)) 

Herhangi bir öneri çok takdir edilecektir!

+1

Tam olarak ne yapmaya çalışıyorsunuz? Çünkü bu tam kodla, elle 8000 kez bir şeyler yazmak istediğinize benziyor. Yapmaya çalıştığınız şeyi yapmak için kesinlikle daha kolay bir yol olacaktır. – idjaw

+1

"Biçim" in yapıp yapamayacağını (oldukça emin olabilir), bu "biçim" için bir işe benzemez. Ayrıca, ciddi olarak 8000 numaralı değişkenler var mı? – user2357112

+1

Bir sınır yoktur, ancak bunu yapmak zorunda kalmak son derece tavsiye edilmez, çünkü okumak ve sürdürmek çok çirkin olacaktır. Dosyanıza 8000 öğeyi manuel olarak tanıtmak ve her şeyi bir kerede yazmak yerine, satır satır satır yazmak daha iyidir. –

cevap

4

Herhangi bir zor sınırın farkında değilim ve 8000 zaten bu kadar büyük değil, bence sorun olmamalı. pozisyonel çiftleşmiş ile

Örnek: adı çiftleşmiş ile

>>> text = "{} "*8000 
>>> text = text.format(*range(8000)) 
>>> '{' in text 
False 
>>> text[:50] 
'0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ' 
>>> text[-50:] 
'7990 7991 7992 7993 7994 7995 7996 7997 7998 7999 ' 

Örnek: aslında kişinin belirtilmediği argümanlar olarak pozisyonel onları geçtiyseniz

>>> s = ' '.join(['{{x{}}}'.format(i) for i in range(8000)]) 
>>> d = {'x{}'.format(i):i for i in range(8000)} 
>>> s[:25] + '...' + s[-24:] 
'{x0} {x1} {x2} {x3} {x4} ... {x7997} {x7998} {x7999}' 
>>> s = s.format(**d) 
>>> s[:25] + '...' + s[-24:] 
'0 1 2 3 4 5 6 7 8 9 10 11...7995 7996 7997 7998 7999' 
5

As wim notes, sen ancak, açma argüman ile yapabilirdi, işe yaramazdı; 255 açıkça verilen bireysel argümanların bir sınırı vardır.

Gösterme:

>>> globals().update(('x{}'.format(i), i) for i in range(8000)) 
>>> codestr = '("{{}}"*8000).format({})'.format(', '.join('x{}'.format(i) for i in range(8000))) 
>>> eval(codestr) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<string>", line 1 
SyntaxError: more than 255 arguments 

sınır CALL_FUNCTION işlem kodu nasıl tanımlandığı kaynaklanmaktadır; opcode'u belirten tek bir bayt olarak kodlanır, sonra konumsal argümanların sayısı için bir bayt ve bir tane de anahtar kelime argümanlarının sayısı için kodlanır. Teoride, 510'a kadar toplam argümanı ele alabilirken, aslında tutarlılık için muhtemelen 255 argümanını bir araya getiriyorlar. Yani, aslında * veya ** paketini açmadan 255'ten fazla toplam argümanla bir işlevi arayamazsınız.

Teknik olarak bir uygulama detayı olan BTW; Bu şekilde çalışacak herhangi bir dil şartı yoktur, bu yüzden gelecekte CPython'un (referans tercümanı) serbest bırakılmasıyla değişebilir ve diğer tercümanlarda farklı şekilde davranır (birçoğu şu anda CPython bayt kodu üretmez veya kullanmaz).

+0

İlginç! Bahsettiğiniz bayt/opcode'un ayrıntılarını iki kez kontrol etmek isteyebilirsiniz. Ben biraz eğittim ve 510 toplam argüman çalışma (python v3.5.0, python v2.7.5, ve pypy v2.2.1) çalıştı asla. Test kayışım [burada] (https://raw.githubusercontent.com/wimglenn/scratch/master/str_nargs.py). – wim

+0

@wim: Daha fazla araştırdım; Her ne kadar kodlama komutu, her birinin 255'ine izin verse de, kümülatif sayıdaki argümanı, muhtemelen uygulama basitliği veya tutarlılığı için toplamda 255 ile sınırlandırmışlardır (konumsal ve anahtar sözcükler arasında eşit olarak bölünmüş 300 argümanı geçebilirseniz garip olurdu. pozisyonel olarak değil 300). – ShadowRanger

+1

[Not: 255 argümanı sınırı Python 3.7'de kaldırılmıştır] (https://docs.python.org/3.7/whatsnew/3.7.html#other-language-changes) – wim

İlgili konular