เครื่องหมายทับหมายความว่าเอาต์พุต help ()


148

อะไร/เฉลี่ยในหลาม 3.4 ของhelpการส่งออกสำหรับrangeก่อนวงเล็บปิดหรือไม่

>>> 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.

                                        ...

คำตอบ:


185

มันหมายถึงจุดสิ้นสุดของพารามิเตอร์ตำแหน่งเท่านั้นพารามิเตอร์ที่คุณไม่สามารถใช้เป็นพารามิเตอร์คำหลัก ก่อน Python 3.8 พารามิเตอร์ดังกล่าวสามารถระบุได้เฉพาะใน C API

หมายความว่าkeyอาร์กิวเมนต์__contains__สามารถส่งผ่านโดย position ( range(5).__contains__(3)) เท่านั้นไม่ใช่อาร์กิวเมนต์อากิวเมนต์ ( range(5).__contains__(key=3)) ซึ่งเป็นสิ่งที่คุณสามารถทำได้ทำได้กับอาร์กิวเมนต์ตำแหน่งในฟังก์ชัน pure-python

ดูเอกสารประกอบของArgument Clinic :

ในการทำเครื่องหมายพารามิเตอร์ทั้งหมดว่าเป็นตำแหน่งอย่างเดียวใน Argument Clinic ให้เพิ่ม/บรรทัดด้วยตัวเองหลังพารามิเตอร์ตัวสุดท้ายเยื้องเช่นเดียวกับบรรทัดพารามิเตอร์

และPython คำถามที่พบบ่อย :

เครื่องหมายทับในรายการอาร์กิวเมนต์ของฟังก์ชันแสดงว่าพารามิเตอร์ก่อนหน้านั้นเป็นตำแหน่งเท่านั้น พารามิเตอร์เฉพาะตำแหน่งคือพารามิเตอร์ที่ไม่มีชื่อภายนอกที่ใช้งานได้ เมื่อเรียกใช้ฟังก์ชันที่ยอมรับพารามิเตอร์ตำแหน่งเท่านั้นอาร์กิวเมนต์จะถูกแมปกับพารามิเตอร์ตามตำแหน่งของพวกเขาเท่านั้น

ไวยากรณ์ตอนนี้เป็นส่วนหนึ่งของสเปคภาษา Python, เป็นรุ่น 3.8ดูPEP 570 -พารามิเตอร์หลามตำแหน่งเท่านั้น ก่อน PEP 570 ไวยากรณ์ถูกสงวนไว้แล้วสำหรับการรวมในอนาคตที่เป็นไปได้ในหลามดูPEP 457 -พารามิเตอร์ไวยากรณ์สำหรับตำแหน่งเท่านั้น

พารามิเตอร์เฉพาะตำแหน่งสามารถนำไปสู่ ​​API ที่สะอาดและชัดเจนขึ้นทำให้การใช้งาน Python ล้วนๆของโมดูล C-only อย่างสอดคล้องและง่ายต่อการบำรุงรักษามากขึ้นและเนื่องจากพารามิเตอร์เฉพาะตำแหน่งต้องการการประมวลผลเพียงเล็กน้อยจึงทำให้รหัส Python เร็วขึ้น


22

ฉันถามคำถามนี้ด้วยตัวเอง :) พบว่า/ได้รับการเสนอเดิมโดยกุยในที่นี่

ข้อเสนอทางเลือก: วิธีการใช้ '/' เป็นประเภทที่ตรงกันข้ามกับ '*' ซึ่งหมายถึง "อาร์กิวเมนต์ของคำหลัก" และ '/' ไม่ใช่อักขระใหม่

แล้วข้อเสนอของเขาได้รับรางวัล

หึ หากเป็นจริงข้อเสนอ '/' ของฉันจะชนะ:

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

ผมคิดว่าเอกสารที่เกี่ยวข้องมากครอบคลุมนี้อยู่PEP 570 ส่วนที่สรุปดูดี

ปะยางรถ

กรณีการใช้งานจะกำหนดพารามิเตอร์ที่จะใช้ในการกำหนดฟังก์ชั่น:

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

เป็นแนวทาง:

ใช้ตำแหน่งเฉพาะถ้าชื่อไม่สำคัญหรือไม่มีความหมายและมีเพียงไม่กี่อาร์กิวเมนต์ที่จะถูกส่งผ่านในลำดับเดียวกันเสมอ ใช้คีย์เวิร์ดเฉพาะเมื่อชื่อมีความหมายและคำจำกัดความของฟังก์ชั่นนั้นสามารถเข้าใจได้ง่ายขึ้นโดยการใช้ชื่อให้ชัดเจน


หากฟังก์ชั่นลงท้ายด้วย /

def foo(p1, p2, /)

ซึ่งหมายความว่าอาร์กิวเมนต์การทำงานทั้งหมดเป็นตำแหน่ง


6
การเลือก/โทเค็นเนื่องจาก "เป็นการดำเนินการแบบผกผันของ*" แสดงว่า Python นั้นคลั่งไคล้นิดหน่อย มันเป็นการรวมตัวกัน
Tomasz Gandor

6

Forward Slash (/) หมายถึงอาร์กิวเมนต์ทั้งหมดก่อนที่จะเป็นอาร์กิวเมนต์ตำแหน่งเท่านั้น มีการเพิ่มคุณสมบัติข้อโต้แย้งเฉพาะตำแหน่งใน python 3.8 หลังจากยอมรับPEP 570 เริ่มแรกมีการกำหนดสัญกรณ์นี้ในPEP 457 - สัญลักษณ์สำหรับสัญกรณ์สำหรับพารามิเตอร์เฉพาะตำแหน่ง

พารามิเตอร์ในการกำหนดฟังก์ชันก่อน Foraward slash (/) เป็นตำแหน่งเท่านั้นและพารามิเตอร์ที่ตามด้วย slash (/) สามารถเป็นชนิดใดก็ได้ตามไวยากรณ์ โดยที่อาร์กิวเมนต์ถูกแม็พกับพารามิเตอร์ตำแหน่งเท่านั้นโดยอิงตามตำแหน่งเมื่อเรียกใช้ฟังก์ชัน การส่งพารามิเตอร์ตำแหน่งอย่างเดียวด้วยคำหลัก (ชื่อ) ไม่ถูกต้อง

ลองทำตัวอย่างต่อไปนี้

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

ที่นี่ในพารามิเตอร์นิยามฟังก์ชันข้างต้น a และ b เป็นตำแหน่งอย่างเดียวในขณะที่ x หรือ y สามารถเป็นได้ทั้งตำแหน่งหรือคำหลัก

การเรียกใช้ฟังก์ชันต่อไปนี้ถูกต้อง

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

แต่การเรียกใช้ฟังก์ชันต่อไปนี้ไม่ถูกต้องซึ่งทำให้เกิดข้อยกเว้น TypeError ตั้งแต่ a, b จะไม่ถูกส่งเป็นอาร์กิวเมนต์ตำแหน่งผ่านแทนคำหลัก

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

TypeError: foo () ได้รับอาร์กิวเมนต์ตำแหน่งเท่านั้นที่ส่งผ่านเป็นอาร์กิวเมนต์คำหลัก: 'a, b'

ฟังก์ชั่นจำนวนมากที่สร้างขึ้นในไพ ธ อนยอมรับอาร์กิวเมนต์เท่านั้นตำแหน่งที่ผ่านการขัดแย้งโดยคำหลักไม่เหมาะสม ตัวอย่างเช่นฟังก์ชันในตัวlenยอมรับอาร์กิวเมนต์เพียงตำแหน่งเดียว (เท่านั้น) โดยที่การเรียก len เป็น len (obj = "hello world") ทำให้อ่านไม่ได้ให้ตรวจสอบ help (len)

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

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

พารามิเตอร์เฉพาะตำแหน่งทำให้ฟังก์ชั่น c / Library พื้นฐานง่ายต่อการบำรุงรักษา อนุญาตให้ชื่อพารามิเตอร์ของพารามิเตอร์ตำแหน่งเท่านั้นสามารถเปลี่ยนแปลงได้ในอนาคตโดยไม่มีความเสี่ยงในการแตกรหัสลูกค้าที่ใช้ API

สุดท้าย แต่ไม่ท้ายสุดพารามิเตอร์เฉพาะตำแหน่งทำให้เราสามารถใช้ชื่อของพวกเขาเพื่อใช้ในอาร์กิวเมนต์คำหลักที่มีความยาวผันแปรได้ ตรวจสอบตัวอย่างต่อไปนี้

>>> 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}

พารามิเตอร์เฉพาะตำแหน่งจะอธิบายได้ดีกว่าที่นี่ที่ประเภทของอาร์กิวเมนต์ของฟังก์ชันในไพ ธ อน: พารามิเตอร์เฉพาะของตำแหน่ง

เพิ่มพารามิเตอร์ไวยากรณ์เฉพาะตำแหน่งอย่างเป็นทางการใน python3.8 ชำระเงินมีอะไรใหม่ python3.8 - อาร์กิวเมนต์เท่านั้นตำแหน่ง

PEP ที่เกี่ยวข้อง: PEP 570 - พารามิเตอร์เฉพาะตำแหน่ง Python เท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.