2016-03-16 20 views
11

'=' alignment có nghĩa là gì trong thông báo lỗi sau và tại sao mã này gây ra?Lỗi định dạng văn bản: liên kết '=' không được phép trong thông số định dạng chuỗi

>>> "{num:03}".format(num="1") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: '=' alignment not allowed in string format specifier 

Mã có vấn đề tinh tế: giá trị đầu vào "1" là văn bản, không phải là số. Nhưng thông báo lỗi dường như không liên quan gì đến điều đó.

Không có gì trong thông báo lỗi cho biết tại sao "'=' căn chỉnh" có liên quan, và nó không xuất hiện trong mã. Vậy ý nghĩa của việc phát ra thông báo lỗi đó là gì?

Trả lời

18

Các thông báo lỗi xảy ra vì '=' alignment đã được ngụ ý bởi sự xác định định dạng.

Các str.formatformat spec mini-language phân tích cú pháp đã quyết định trên alignment specifier “=” vì:

Preceding the width field by a zero ('0') character enables sign-aware zero-padding for numeric types. This is equivalent to a fill character of '0' with an alignment type of '='.

Vì vậy bằng cách xác định 0N là “zero-padding để N chiều rộng”, bạn đã ngụ ý cả “đầu vào là một loại số ", và" số không nên đi giữa dấu và chữ số ". Hàm ý sau đó là ý nghĩa của '=' alignment.

Vì giá trị "1" không phải là số, "=" - mã xử lý căn chỉnh làm tăng ngoại lệ đó. Thông điệp được viết mong đợi bạn biết những gì nó nói về bởi vì bạn yêu cầu (bằng cách ngụ ý) sự liên kết "=".

Có, tôi nghĩ rằng thông báo lỗi cần được cải thiện. Tôi đã raised an issue for that.

-1

Định dạng này sẽ được chấp nhận

"{num}:03".format(num="1") 

nhưng cách bạn có giữ chỗ quy định {num:03} thì không. Đó là một ValueError thú vị mặc dù, nếu bạn loại bỏ các : lỗi thú vị được thay thế bằng một tiêu chuẩn KeyError.

+0

Điều này không làm những gì OP có ý định. Họ muốn căn trái một chuỗi đệm bằng cách sử dụng 'định dạng'. –

+0

Ah ok tôi thấy bây giờ. Điều đó có ý nghĩa hơn. – pholtz

3

str.__format__ không biết phải làm gì với phần 03 của bạn. Đó chỉ làm việc với những con số:

>>> "{num:03}".format(num=1) 
'001' 

Nếu bạn thực sự muốn zero-pad một chuỗi, bạn có thể sử dụng rjust:

>>> "1".rjust(3, "0") 
'001' 
0

Bạn đang cố gắng chèn 'chuỗi -> "1" trong đó yêu cầu float-> 3.44. Hủy bỏ các dấu ngoặc kép "1", tức là num = 1, và nó sẽ làm việc

4

Một cách giải quyết là sử dụng '>' (phải biện minh) đệm, đó là với cú pháp:

[[fill]align][width] 

với class là > và điền vào là 0.

Điền các giá trị mặc định là không gian.

>>> "{num:0>3}".format(num="1") 
'001' 

Vấn đề là giá trị mặc định align để = có nghĩa

Forces the padding to be placed after the sign (if any) but before the digits. This is used for printing fields in the form ‘+000000120’. This alignment option is only valid for numeric types. It becomes the default when ‘0’ immediately precedes the field width.

Source (Python 3 docs)

Không có dấu hiệu trong chuỗi. Bạn cũng có thể chỉ định các class bằng tay và sử dụng cú pháp:

[align]0[width] 
>>> "{num:>03}".format(num="1") 
'001' 

Cũng lưu ý:

>>> "{num:^03} {num:<03}".format(num="1") 
'010 100' 

mà làm việc với cùng một logic nhưng đối với class bị bỏ lại biện minh (<) và center (^)

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