2017-06-22 27 views
5

Trong Python, để lại một dấu phẩy dấu như thế này, tất nhiên, không phải là một SyntaxError:không chủ ý dấu phẩy mà tạo ra một tuple

In [1]: x = 1 , 

In [2]: x 
Out[2]: (1,) 

In [3]: type(x) 
Out[3]: tuple 

Nhưng, đồng thời, nếu các dấu phẩy dấu được đưa vô tình, có thể khó nắm bắt loại "sự cố" này, đặc biệt đối với người mới sử dụng Python.

Tôi đang nghĩ nếu chúng ta có thể bắt loại "sự cố" này sớm, tĩnh, với sự trợ giúp của PyCharm tính năng kiểm soát chất lượng mã thông minh; mypy, pylint hoặc flake8 công cụ phân tích mã tĩnh.

Hoặc, một ý tưởng khác sẽ là hạn chế/đánh dấu tạo một mục tuples hoàn toàn không có dấu ngoặc đơn. Có thể không?

+0

@onlynone btw, tôi không chắc chắn những gì bạn có nghĩa là bởi các câu hỏi/câu lệnh đầu tiên. Tôi có nên đặt thêm một "Có thể không?" cho phần đầu tiên của câu hỏi? Tôi nghĩ rằng nó khá rõ ràng những gì tôi có nghĩa là, nhưng hãy cho tôi biết nếu có bất cứ điều gì có thể được cải thiện để làm cho câu hỏi sạch hơn. Cảm ơn. – alecxe

+1

Tôi đoán nó ổn. Nó chỉ là một cách kỳ quặc: "là nó có thể (để phát hiện vấn đề này với phân tích mã tĩnh)" là loại của một rõ ràng "có!" - đó chính xác là những gì các công cụ phân tích mã tĩnh làm. Và nó chỉ ra một trong những người phổ biến nhất cho python, và một trong những bạn đề cập đến chính mình, không chính xác những gì bạn muốn. Cách giải thích khác, "là nó có thể (để hạn chế việc tạo ra một mục tuples không có parens)", có vẻ là một "không" rõ ràng vì nó chỉ là cách python hoạt động. – onlynone

+1

PEP8 là mơ hồ bất thường mô tả việc sử dụng dấu phẩy sau này là "OK, nhưng gây nhầm lẫn:" Tôi mong đợi hướng dẫn có thẩm quyền hơn https://www.python.org/dev/peps/pep-0008/#when-to-use- trailing-commas –

Trả lời

11

pylint đã phát hiện vấn đề này là một sự cố (as of version 1.7).

Ví dụ, đây là tôi tuple.py:

"""Module docstring to satisfy pylint""" 

def main(): 
    """The main function""" 
    thing = 1, 
    print(type(thing)) 

if __name__ == "__main__": 
    main() 
$ pylint tuple.py 
No config file found, using default configuration 
************* Module tuple 
R: 5, 0: Disallow trailing comma tuple (trailing-comma-tuple) 

------------------------------------------------------------------ 
Your code has been rated at 8.00/10 (previous run: 8.00/10, +0.00) 

$ pylint --help-msg trailing-comma-tuple 
No config file found, using default configuration 
:trailing-comma-tuple (R1707): *Disallow trailing comma tuple* 
    In Python, a tuple is actually created by the comma symbol, not by the 
    parentheses. Unfortunately, one can actually create a tuple by misplacing a 
    trailing comma, which can lead to potential weird bugs in your code. You 
    should always use parentheses explicitly for creating a tuple. This message 
    belongs to the refactoring checker. It can't be emitted when using Python < 
    3.0. 
0

Đây không phải là hành vi ngoài ý muốn vì toán tử tuple là ,, không phải (). Vai trò của dấu ngoặc đơn ở đây giống như trong biểu thức số học. Vì vậy, bạn không thể hạn chế việc tạo ra như vậy trong một trình thông dịch Python, nếu không nó sẽ là một số ngôn ngữ khác.

Tôi đồng ý rằng dấu phẩy sau đôi khi không chủ ý. Các công cụ Lint như pylint thường có thể gặp lỗi như vậy bằng phương pháp suy luận kiểu chung (nghĩa là họ thấy rằng bạn cố thêm một bộ dữ liệu vào một số). (Cũng lưu ý rằng đôi khi dấu phẩy là hữu ích và ít chủ ý hơn, ví dụ như trong the_only_elem, = our_list.) Một tùy chọn khác là viết cho bạn sở hữu linter đơn giản để kiểm tra cái gì đó như line.rstrip().endswith(',') and '=' in line (kiểm tra thứ hai là cho phép khai báo danh sách nhiều dòng ở một mức độ nào đó).

+0

Trình kiểm tra linter của bạn sẽ mang lại nhiều kết quả sai (ít nhất là trong mã của tôi): 'data = func (param1, \ n param2 ...)' – MariusSiuram

+0

@MariusSiuram Không có "trình kiểm tra linter" của tôi trong câu trả lời, chỉ là hình minh họa. Tôi đã đề cập rằng nó không hoàn hảo. –

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