อาร์กิวเมนต์เฉพาะคีย์เวิร์ด python3 ( *
) สามารถจำลองใน python2.x ด้วย**kwargs
พิจารณารหัส python3 ต่อไปนี้:
def f(pos_arg, *, no_default, has_default='default'):
print(pos_arg, no_default, has_default)
และพฤติกรรมของมัน:
>>> f(1, 2, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() takes 1 positional argument but 3 were given
>>> f(1, no_default='hi')
1 hi default
>>> f(1, no_default='hi', has_default='hello')
1 hi hello
>>> f(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() missing 1 required keyword-only argument: 'no_default'
>>> f(1, no_default=1, wat='wat')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() got an unexpected keyword argument 'wat'
สิ่งนี้สามารถจำลองได้โดยใช้สิ่งต่อไปนี้โปรดทราบว่าฉันได้ใช้เสรีภาพในการเปลี่ยนTypeError
ไปใช้KeyError
ในกรณี "อาร์กิวเมนต์ที่ระบุชื่อที่จำเป็น" มันจะไม่เป็นการทำงานมากเกินไปที่จะทำให้เป็นประเภทข้อยกเว้นเดียวกันเช่นกัน
def f(pos_arg, **kwargs):
no_default = kwargs.pop('no_default')
has_default = kwargs.pop('has_default', 'default')
if kwargs:
raise TypeError('unexpected keyword argument(s) {}'.format(', '.join(sorted(kwargs))))
print(pos_arg, no_default, has_default)
และพฤติกรรม:
>>> f(1, 2, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() takes exactly 1 argument (3 given)
>>> f(1, no_default='hi')
(1, 'hi', 'default')
>>> f(1, no_default='hi', has_default='hello')
(1, 'hi', 'hello')
>>> f(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
KeyError: 'no_default'
>>> f(1, no_default=1, wat='wat')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in f
TypeError: unexpected keyword argument(s) wat
สูตรนี้ใช้งานได้เท่าเทียมกันใน python3.x แต่ควรหลีกเลี่ยงหากคุณเป็น python3.x เท่านั้น