2013-05-14 28 views
15

Tại sao đôi khi các khoảng trống có thể bị bỏ qua trước và sau các từ khóa? Ví dụ: tại sao biểu thức 2if-1e1else 1 hợp lệ?Tại sao Python không đòi hỏi không gian xung quanh từ khóa?

Dường như làm việc trong cả hai CPython 2.7 và 3.3:

$ python2 
Python 2.7.3 (default, Nov 12 2012, 09:50:25) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 2if-1e1else 1 
2 

$ python3 
Python 3.3.0 (default, Nov 12 2012, 10:01:55) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 2if-1e1else 1 
2 

và ngay cả trong PyPy:

$ pypy 
Python 2.7.2 (341e1e3821ff, Jun 07 2012, 15:42:54) 
[PyPy 1.9.0 with GCC 4.2.1] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
And now for something completely different: ``PyPy 1.6 released!'' 
>>>> 2if-1e1else 1 
2 
+0

wtf – wim

+0

bắt đầu giống như perl – jamylak

Trả lời

12

định danh trong python được mô tả như:

identifier ::= (letter|"_") (letter | digit | "_")* 

Do đó, 2if không thể là số nhận dạng do đó nếu phải là 2, if. Logic tương tự áp dụng cho phần còn lại của biểu thức.

Về cơ bản giải thích 2if-1e1else 1 sẽ đi một cái gì đó như thế này (toàn bộ phân tích cú pháp sẽ là khá phức tạp):

2if không định danh hợp lệ, 2 phù hợp với chữ số digit ::= "0"..."9", if phù hợp với từ khóa. -1e1else, -1 là sự phủ định unary (u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr) của : (. 1 mà phù hợp intpart trong exponentfloat ::= (intpart | pointfloat) | exponent , e1 là mũ exponent ::= ("e" | "E") ["+" | "-"] digit+) Bạn có thể thấy biểu hiện dưới hình thức Ne+|-x mang lại một phao này từ:

>>> type(2e3) 
<type 'float'> 

thì else được xem là từ khóa và -1 v.v.

Bạn có thể xem xét gammar để đọc thêm về nó.

+0

* "...' -1' khớp với 'intpart' ..." * chờ đợi, cái gì? Không phải là '-' một nhà điều hành đơn nhất? – Mehrdad

+0

Làm nổi bật ngữ pháp để cho biết cách phân tích cú pháp. Nice liên lạc. – squiguy

+0

@Mehrdad xin lỗi, chỉnh sửa có rõ ràng hơn không? – HennyH

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