2010-09-16 17 views
1

Tenir compte l'extrait suivant:Python '' .format(): "index de tuple hors limites"?

>>> def foo(port, out, udp=False, ipv6=False, data=''): 
...  if not data: 
...    data = 'foo {family} {:port} {direction}'.format(
...        family=('ipv6' if ipv6 else 'ipv4'), 
...        port=port, 
...        direction=('out' if out else 'in')) 
...  return data 
... 
>>> foo(12345, out=True) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 6, in foo 
IndexError: tuple index out of range 

Pour autant que je sache, la portée des noms bien regarder. Qu'est-ce qui se passe avec l'erreur cryptique?

+0

Nevermind. '{: port}' devrait être '{port:}'. – Santa

Répondre

2

Regardez le colon. Déplacer de l'avant de la zone portuaire:

Soit

data = 'foo {family} {port:} {direction}'.format(

Ou

data = 'foo {family} :{port} {direction}'.format(

Les résultats des deux options sont:

>>> foo(12345, out=True) 
'foo ipv4 12345 out' 
>>> foo(12345, out=True) 
'foo ipv4 :12345 out'  
+0

Noté. Ils sont appelés "colons". ;-) – Santa

+0

Ce n'est pas pédant du tout :) Remédié. –

0

{:port} devrait être {port:}.