** ชื่ออะไรในไพ ธ อน?


59

บางครั้งฉันเขียนโปรแกรม Python **เพื่อทำการแปลง ฉันเข้าใจสิ่งที่มันทำ แต่ฉันกำลังจัดการกับโครงสร้างข้อมูลอะไร? A dictและอื่น ๆ คืออะไร? array? มีชื่อสำหรับ**ผู้ประกอบการหรือไม่?


3
ผู้ประกอบการชี้แจง?
โกง

12
**มีสองความหมายสำหรับการเป็น Power และ "พจนานุกรมอาร์กิวเมนต์คำหลัก" คุณกำลังพูดถึงเรื่องอะไร เอกสารประกอบมีคำเหล่านี้: "ถ้าแบบฟอร์ม“ ** ตัวระบุ” มีอยู่จะถูกเตรียมใช้งานเป็นพจนานุกรมใหม่ที่ได้รับการขัดแย้งคำหลักมากเกินไปเริ่มต้นเป็นพจนานุกรมที่ว่างเปล่าใหม่" คำถามใดที่เกี่ยวข้องกับคำถามของคุณ
S.Lott

"พจนานุกรมอาร์กิวเมนต์คำหลัก" เป็นสิ่งที่ฉันถาม ขอบคุณสำหรับความคิดเห็น
Niklas Rosencrantz

คำตอบ:


86

มันไม่ได้เป็นผู้ประกอบการเป็นเช่นนี้จึงไม่ได้จริงๆมีชื่อ แต่มันถูกกำหนดให้เป็น "กฎประโยค" ดังนั้นควรเรียกว่า:

  • "อาร์กิวเมนต์คำหลักกำลังคลายไวยากรณ์"

หากคุณมีรายการของการขัดแย้งที่*argsก็เรียกว่า"ข้อโต้แย้งเอาออก"ในลักษณะเดียวกัน**kwargsที่เรียกว่า"การโต้แย้งคำหลักเอาออก"

หากคุณใช้มันในทางด้านซ้ายมือของ=ในขณะที่a, *middle, end = my_tupleคุณจะบอกว่า"tuple เอาออก"

โดยรวมมีอาร์กิวเมนต์ (พารามิเตอร์เดียว) สามประเภท:

def f(x)  # x: positional argument
def f(x, y=0)  # y: keyword argument
def f(x, *xs, y=0)  # y: keyword-only argument

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

ส่วนใหญ่สามารถพบได้ใน PEPs 0362และ3102เช่นเดียวกับในส่วนFlow Controlของเอกสาร ควรสังเกตว่าฟังก์ชันลายเซ็นวัตถุ PEP เป็นเพียงร่างและคำศัพท์อาจเป็นเพียงความคิดของคนคนหนึ่ง แต่พวกเขาเป็นเงื่อนไขที่ดีอยู่แล้ว :)

ดังนั้น*และ**ข้อโต้แย้งเพียงแกะโครงสร้างข้อมูลที่เกี่ยวข้อง:

args = (1, 2, 3)  # usually a tuple, always an iterable[1]

f(*args)  f(1, 2, 3)

# and 

kwargs = {"a": 1, "b": 2, "c": 3}  # usually a dict, always a mapping*

f(**kwargs) -> f(a=1, b=2, c=3)

[1]: Iterables เป็นวัตถุที่ใช้__iter__()วิธีการและแมปเป็นวัตถุที่ใช้และkeys() __getitem__()วัตถุใด ๆ ที่สนับสนุนโปรโตคอลนี้จะถูกเข้าใจโดยผู้สร้างtuple()และdict()เพื่อให้พวกเขาสามารถใช้สำหรับการเปิดออกอาร์กิวเมนต์


3
ในกรณีที่คนอื่นสับสนdef f(x, *xs, y=0): passไม่ถูกต้อง Python 2 {5,6,7} ไวยากรณ์และไม่def f(x, y=0, *xs):ทำสิ่งที่คุณอาจคาดหวัง AFAIK, วิธีเดียวที่จะบรรลุ (ชัด) def f(x, *xs, **kw): y=kw.get('y', 0); del kw; ...ตั้งใจผลที่ได้คือ Python 3 จัดการกับไวยากรณ์ดั้งเดิมตามที่คาดไว้
chbrown

1
ในขณะที่เราอยู่ที่: begin, *middle, end = (0, 1, 2, 3, 4, 5)ไวยากรณ์ไม่ทำงานใน Python 2.x อย่างใดอย่างหนึ่ง
Stefano Palazzo

คำตอบนี้ไม่ถูกต้องใน Python 3.5 และใหม่กว่า PEP-448 ระบุตัวดำเนินการ ** เป็นตัวดำเนินการเปิดพจนานุกรม ดูpython.org/dev/peps/pep-0448
devnul3

13

ฉันไม่คิดว่ามันจะมีชื่อ ในPython Docsภายใต้ "Unpacking Argument Lists" จะเรียกว่า " **-operator"

ฉันไม่แน่ใจว่าคุณหมายถึงอะไรโดยโครงสร้างข้อมูล "อื่น ๆ " เมื่อคุณf(**kwargs)แกะพจนานุกรมออกkwargsเป็นลำดับของคู่คีย์ - ค่า ฉันไม่เห็นว่ามีโครงสร้างอื่นที่เกี่ยวข้อง

ฉันจะคัดลอกตัวอย่างในเอกสารด้านบนเพื่อความชัดเจน

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print "-- This parrot wouldn't", action,
...     print "if you put", voltage, "volts through it.",
...     print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !

ดูเพิ่มเติมที่: * args และ ** kwargs หมายถึงอะไร


มีวิธีที่เป็นไปได้หลายวิธีที่ผู้อ่านอาจตีความf(**kwargs)...
Deer Hunter

3

หากคุณไม่แน่ใจว่าจะเรียกผู้ให้บริการเฉพาะรายใดหรือไม่ระบุชื่อคุณสามารถหันไปใช้Waka Waka Bang Splatเพื่อเป็นข้อมูลอ้างอิงเพื่อช่วยให้คุณทราบว่าจะเรียกมันว่าอะไร ในกรณีนี้**ผมจะเรียกมันว่าdouble-splatแม้ว่าจะมีบางส่วนชื่ออื่นสำหรับสัญลักษณ์

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