2017-01-13 2 views
7

Ich habe bereits this Frage überprüft, konnte aber keine Antwort finden. Hier ist ein einfaches Beispiel, das mein Anwendungsfall zeigt:IndexError: Tupel-Index außerhalb des Bereichs beim Parsen von Methodenargumenten

def log(*args): 
    message = str(args[0]) 
    arguments = tuple(args[1:]) 
    # message itself 
    print(message) 
    # arguments for str.format()0 
    print(arguments) 
    # shows that arguments have correct indexes 
    for index, value in enumerate(arguments): 
     print("{}: {}".format(index, value)) 
    # and amount of placeholders == amount of arguments 
    print("Amount of placeholders: {}, Amount of variables: {}".format(message.count('{}'), len(arguments))) 

    # But this still fails! Why? 
    print(message.format(arguments)) 

log("First: {}, Second: {}, Third: {}, Fourth: {}", "asdasd", "ddsdd", "12312333", "fdfdf") 

Und die Ausgabe:

First: {}, Second: {}, Third: {}, Fourth: {} 
('asdasd', 'ddsdd', '12312333', 'fdfdf') 
0: asdasd 
1: ddsdd 
2: 12312333 
3: fdfdf 
Amount of placeholders: 4, Amount of variables: 4 
Traceback (most recent call last): 
    File "C:/Users/sbt-anikeev-ae/IdeaProjects/test-this-thing-on-python/test-this-thing.py", line 12, in <module> 
    log("First: {}, Second: {}, Third: {}, Fourth: {}", "asdasd", "ddsdd", "12312333", "fdfdf") 
    File "C:/Users/sbt-anikeev-ae/IdeaProjects/test-this-thing-on-python/test-this-thing.py", line 10, in log 
    print(message.format(arguments)) 
IndexError: tuple index out of range 

PS: ich schon geweigert, ein solches Verfahren unter Verwendung von (die str.format() Wraps), wie es scheint zu viel zu sein. Aber es verwirrt mich immer noch, warum würde das nicht wie erwartet funktionieren?

Antwort

9

Sie haben * zu verwenden, um die Tupel in tatsächliche Argumente für format auszupacken:

print(message.format(*arguments)) 

andernfalls wird arguments als einziges Argument von Format zu sehen (und es funktioniert für das erste {} Auftreten, durch die Umwandlung Ihrer Tupel zu string, aber drosselt, wenn es das zweite Vorkommen von {} trifft)

1

Sie müssen Argumente nicht Tupel übergeben. Dies geschieht mit '* arguments'. Expanding tuples into arguments

def log(*args): 
    message = str(args[0]) 
    arguments = tuple(args[1:]) 
    # message itself 
    print(message) 
    # arguments for str.format()0 
    print(arguments) 
    # shows that arguments have correct indexes 
    for index, value in enumerate(arguments): 
     print("{}: {}".format(index, value)) 
    # and amount of placeholders == amount of arguments 
    print("Amount of placeholders: {}, Amount of variables: {}".format(message.count('{}'), len(arguments))) 

    # But this still fails! Why? 
    print(type(arguments)) 
    print(message.format(*arguments)) 

log("First: {}, Second: {}, Third: {}, Fourth: {}", "asdasd", "ddsdd", "12312333", "fdfdf") 
0

dieses Versuchen

print(message.format(*arguments)) 

format kein Tupel

+0

Sie haben Recht, aber 'arguments' ist ein Tupel :) – ppasler

+0

@ppasler, oops nicht erwartet. Du hast natürlich Recht. – user650881

Verwandte Themen