Dấu gạch chéo có nghĩa là gì trong đầu ra help ()?


148

Ý /nghĩa trong helpđầu ra của Python 3.4 là gì rangetrước khi đóng ngoặc?

>>> help(range)
Help on class range in module builtins:

class range(object)
 |  range(stop) -> range object
 |  range(start, stop[, step]) -> range object
 |  
 |  Return a virtual sequence of numbers from start to stop by step.
 |  
 |  Methods defined here:
 |  
 |  __contains__(self, key, /)
 |      Return key in self.
 |  
 |  __eq__(self, value, /)
 |      Return self==value.

                                        ...

Câu trả lời:


185

Nó biểu thị sự kết thúc của các tham số chỉ vị trí , các tham số bạn không thể sử dụng làm tham số từ khóa. Trước Python 3.8, các tham số như vậy chỉ có thể được chỉ định trong API C.

Nó có nghĩa là keyđối số __contains__chỉ có thể được truyền vào bởi vị trí ( range(5).__contains__(3)), không phải là đối số từ khóa ( range(5).__contains__(key=3)), một điều bạn có thể làm với các đối số vị trí trong các hàm python thuần.

Đồng thời xem tài liệu của Phòng khám đối số :

Để đánh dấu tất cả các tham số là chỉ theo vị trí trong Argument Clinic, hãy thêm /một dòng trên chính nó sau tham số cuối cùng, thụt lề giống như các dòng tham số.

và (bổ sung rất gần đây) Câu hỏi thường gặp về Python :

Dấu gạch chéo trong danh sách đối số của hàm biểu thị rằng các tham số trước nó chỉ là vị trí. Các tham số chỉ vị trí là những tham số không có tên có thể sử dụng được bên ngoài. Khi gọi một hàm chấp nhận các tham số chỉ vị trí, các đối số được ánh xạ tới các tham số chỉ dựa trên vị trí của chúng.

Cú pháp hiện là một phần của đặc tả ngôn ngữ Python, kể từ phiên bản 3.8 , xem PEP 570 - Tham số chỉ vị trí của Python . Trước PEP 570, cú pháp đã được dành riêng để đưa vào tương lai có thể có trong Python, xem PEP 457 - Cú pháp cho các tham số chỉ theo vị trí .

Các tham số chỉ có vị trí có thể dẫn đến các API sạch hơn và rõ ràng hơn, làm cho việc triển khai Python thuần túy của các mô-đun chỉ C khác phù hợp hơn và dễ bảo trì hơn và vì các tham số chỉ theo vị trí yêu cầu xử lý rất ít, chúng dẫn đến mã Python nhanh hơn.


21

Tôi đã tự hỏi câu hỏi này. :) Phát hiện ra rằng /ban đầu được đề xuất bởi Guido ở đây .

Đề xuất thay thế: làm thế nào về việc sử dụng '/'? Nó trái ngược với '*' có nghĩa là "đối số từ khóa" và '/' không phải là một ký tự mới.

Sau đó, đề nghị của ông đã thắng .

Heh. Nếu đó là sự thật, đề xuất '/' của tôi thắng:

 def foo(pos_only, /, pos_or_kw, *, kw_only): ...

Tôi nghĩ rằng tài liệu rất phù hợp bao gồm điều này là PEP 570 . Phần tóm tắt trông đẹp.

Tóm tắt

Ca sử dụng sẽ xác định tham số nào sẽ sử dụng trong định nghĩa hàm:

 def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):

Theo hướng dẫn:

Chỉ sử dụng vị trí nếu tên không quan trọng hoặc không có ý nghĩa và chỉ có một vài đối số sẽ luôn được truyền theo cùng một thứ tự. Chỉ sử dụng từ khóa khi tên có ý nghĩa và định nghĩa hàm dễ hiểu hơn bằng cách rõ ràng với tên.


Nếu chức năng kết thúc bằng /

def foo(p1, p2, /)

Điều này có nghĩa là tất cả các đối số chức năng là vị trí.


6
Chọn /mã thông báo, vì "đó là hoạt động nghịch đảo *" cho thấy, Python chỉ là một chút điên rồ. Đó là một loại khớp thần kinh.
Tomasz Gandor

6

Dấu gạch chéo (/) cho biết tất cả các đối số trước nó là đối số chỉ theo vị trí. Tính năng đối số chỉ vị trí đã được thêm vào python 3.8 sau khi PEP 570 được chấp nhận. Ban đầu ký hiệu này được định nghĩa trong PEP 457 - Ký hiệu cho ký hiệu chỉ tham số vị trí

Các tham số trong định nghĩa hàm trước dấu gạch chéo Foraward (/) chỉ là vị trí và các tham số theo sau dấu gạch chéo (/) có thể là bất kỳ loại nào theo cú pháp. Trong đó các đối số được ánh xạ tới các tham số chỉ theo vị trí chỉ dựa trên vị trí của chúng khi gọi hàm. Truyền tham số chỉ vị trí theo từ khóa (tên) là không hợp lệ.

Hãy lấy ví dụ sau

def foo(a, b, / , x, y):
   print("positional ", a, b)
   print("positional or keyword", x, y)

Ở đây trong các tham số định nghĩa hàm trên và a chỉ là vị trí, trong khi x hoặc y có thể là vị trí hoặc từ khóa.

Các cuộc gọi chức năng sau đây là hợp lệ

foo(40, 20, 99, 39)
foo(40, 3.14, "hello", y="world")
foo(1.45, 3.14, x="hello", y="world")

Nhưng, lệnh gọi hàm sau không hợp lệ, điều này làm tăng ngoại lệ TypeError vì a, b không được truyền dưới dạng đối số vị trí thay vì được chuyển dưới dạng từ khóa

foo(a=1.45, b=3.14, x=1, y=4)

TypeError: foo () có một số đối số chỉ vị trí được truyền dưới dạng đối số từ khóa: 'a, b'

Nhiều hàm được xây dựng trong python chỉ chấp nhận các đối số theo vị trí trong đó việc truyền các đối số theo từ khóa không có ý nghĩa. Ví dụ, hàm dựng sẵn len chỉ chấp nhận một đối số vị trí (chỉ), trong đó gọi len là len (obj = "hello world") làm suy yếu khả năng đọc, kiểm tra trợ giúp (len).

>>> help(len)
Help on built-in function len in module builtins:

len(obj, /)
    Return the number of items in a container.

Các tham số chỉ vị trí làm cho các chức năng thư viện c / thư viện dễ bảo trì. Nó cho phép tên tham số của các tham số chỉ vị trí sẽ thay đổi trong tương lai mà không có nguy cơ phá vỡ mã máy khách sử dụng API

Cuối cùng nhưng không kém phần quan trọng, các tham số chỉ vị trí cho phép chúng ta sử dụng tên của chúng để được sử dụng trong các đối số từ khóa có độ dài thay đổi. Kiểm tra ví dụ sau

>>> def f(a, b, /, **kwargs):
...     print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3)         # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}

Các tham số chỉ vị trí được giải thích tốt hơn ở đây tại Các loại đối số hàm trong python: Tham số chỉ vị trí

Cú pháp tham số chỉ vị trí đã chính thức được thêm vào python3.8. Kiểm tra python3.8 mới là gì - đối số chỉ theo vị trí

PEP liên quan: PEP 570 - Tham số chỉ vị trí của Python

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.