2013-05-24 15 views
8

Tôi muốn dán một chuỗi có ký tự rỗng ("\ x00"). Tôi biết rất nhiều cách để làm điều này, vì vậy xin vui lòng không trả lời với các lựa chọn thay thế. Những gì tôi muốn biết là: Tại sao chức năng string.format() của Python không cho phép đệm bằng null?Tại sao không thể sử dụng chuỗi string.format của Python với " x00"?

trường hợp thử nghiệm:

>>> "{0:\x01<10}".format("bbb") 
'bbb\x01\x01\x01\x01\x01\x01\x01' 

Điều này cho thấy ký tự hex thoát làm việc nói chung.

>>> "{0:\x00<10}".format("bbb") 
'bbb  ' 

Nhưng "\ x00" được chuyển thành không gian ("\ x20").

>>> "{0:{1}<10}".format("bbb","\x00") 
'bbb  ' 
>>> "{0:{1}<10}".format("bbb",chr(0)) 
'bbb  ' 

Thậm chí thử một vài cách khác để thực hiện.

>>> "bbb" + "\x00" * 7 
'bbb\x00\x00\x00\x00\x00\x00\x00' 

này hoạt động, nhưng không sử dụng không gian string.format

>>> spaces = "{0: <10}".format("bbb") 
>>> nulls = "{0:\x00<10}".format("bbb") 
>>> spaces == nulls 
True 

Python được thay thế rõ ràng (chr(0x20)) thay vì null (chr(0x00)).

+4

Vui lòng để lại nhận xét khi bạn downvote để tôi có thể cải thiện câu hỏi này. Tôi đã thực hiện nghiên cứu của mình và biết về 'ljust' và các cách khác để hoàn thành nhiệm vụ. Tôi muốn biết tại sao python 2.7 hoạt động theo cách này. – bonsaiviking

+0

Sử dụng "in" bbb "+" \ x00 "* 7' và bạn sẽ nhận được một chuỗi có 7 dấu cách. Shell luôn in "\ x00" làm ký tự khoảng trắng. Nếu không có trình bao in trả về phiên bản 'repr' của chuỗi. –

Trả lời

0

Bởi vì phương pháp string.format trong Python2.7 là cổng sau từ Python3 string.format. Python2.7 unicode là chuỗi Python 3, trong đó chuỗi Python2.7 là các byte Python3. Một chuỗi là kiểu sai để biểu diễn dữ liệu nhị phân trong Python3. Bạn sẽ sử dụng các byte không có phương thức định dạng. Vì vậy, thực sự bạn nên hỏi tại sao là phương pháp format trên chuỗi ở tất cả trong 2,7 khi nó cần phải có thực sự chỉ được trên loại unicode vì đó là những gì đã trở thành chuỗi trong Python3.

Tôi đoán câu trả lời là quá thuận tiện để có nó ở đó.

Như một vấn đề có liên quan tại sao không có format on bytes chưa

+0

Điều này mang lại kết quả tương tự: 'u" {0: \ x00 <10} "định dạng (u" bbb ")'. Mã nguồn cho thấy rằng các loại unicode và string sử dụng cùng một trình định dạng. – bonsaiviking

+0

@bonsaiviking có, điểm là '.format' không dành cho dữ liệu nhị phân và không được sử dụng cho dữ liệu nhị phân. Cố gắng sử dụng phương thức unicode cho dữ liệu nhị phân sẽ không hoạt động tốt. – cmd

4

Đào vào mã nguồn cho Python 2.7, tôi thấy rằng vấn đề là trong phần này từ ./Objects/stringlib/formatter.h, dòng 718-722 (trong phiên bản 2.7.3) :

/* Write into that space. First the padding. */ 
p = fill_padding(STRINGLIB_STR(result), len, 
       format->fill_char=='\0'?' ':format->fill_char, 
       lpad, rpad); 

Sự cố là ký tự không/rỗng ('\0') đang được sử dụng làm mặc định khi không có ký tự đệm. Điều này là để cho phép hành vi này:

>>> "{0:<10}".format("foo") 
'foo  ' 

Có thể để thiết lập format->fill_char = ' '; như là mặc định trong parse_internal_render_format_spec() tại ./Objects/stringlib/formatter.h:186, nhưng có một số chút thông tin về khả năng tương thích ngược để kiểm tra cho '\0' sau này. Trong mọi trường hợp, sự tò mò của tôi là hài lòng. Tôi sẽ chấp nhận câu trả lời của người khác nếu nó có nhiều lịch sử hơn hoặc giải thích rõ hơn về lý do này.

2

Câu trả lời cho câu hỏi ban đầu là nó là một lỗi trong python.

Tài liệu đã được ghi nhận là được phép nhưng không được. Nó đã được sửa vào năm 2014. Đối với trăn 2, sửa chữa đầu tiên xuất hiện trong 2.7.7 hoặc 2.7.8 (Tôi không chắc chắn làm thế nào để cho biết)

Theo dõi ban đầu issue.

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