2017-01-13 21 views
7

Tôi đã kiểm tra câu hỏi this nhưng không thể tìm thấy câu trả lời ở đó. Dưới đây là một ví dụ đơn giản thể hiện trường hợp sử dụng của tôi:IndexError: chỉ mục tuple nằm ngoài phạm vi khi phân tích đối số phương thức

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") 

Và kết quả:

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: Tôi đã từ chối sử dụng một phương pháp như vậy (mà kết thúc tốt đẹp str.format()), vì nó có vẻ là dư thừa. Nhưng nó vẫn còn câu đố tôi, tại sao nó sẽ không hoạt động như mong đợi?

Trả lời

9

bạn phải sử dụng * để giải nén các tuple vào đối số thực tế cho format:

print(message.format(*arguments)) 

khác, arguments được xem như là đối số duy nhất của định dạng (và nó hoạt động cho {} xuất hiện đầu tiên, bằng cách chuyển đổi của bạn tuple thành chuỗi, nhưng cuộn cảm khi gặp phải lần xuất hiện thứ hai của {})

1

Bạn cần phải vượt qua đối số chứ không phải đối số. Điều này được thực hiện bằng cách sử dụng '* đối số'. 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

Hãy thử điều này

print(message.format(*arguments)) 

format không mong đợi một tuple

+0

Bạn nói đúng, nhưng 'arguments' là một tuple :) – ppasler

+0

@ppasler, oops. Bạn nói đúng, tất nhiên rồi. – user650881

Các vấn đề liên quan