您可以在字典键视图上使用 set 操作:
if len(kargs.viewkeys() & {'dollar', 'euro'}) != 1:
raise ValueError('One keyword argument is required: dollar=x or euro=x')
在 Python 3 中,请kargs.keys()
改用。
集合操作的不同结果的演示:
>>> kargs = {'dollar': 1, 'euro': 3, 'foo': 'bar'}
>>> kargs.viewkeys() & {'dollar', 'euro'}
set(['dollar', 'euro'])
>>> del kargs['euro']
>>> kargs.viewkeys() & {'dollar', 'euro'}
set(['dollar'])
>>> del kargs['dollar']
>>> kargs.viewkeys() & {'dollar', 'euro'}
set([])
换句话说,&
集合交集为您提供了两个集合中存在的所有键的集合;在字典和您的显式集合文字中。只有当一个且只有一个命名键存在时,交集的长度才会为 1。
如果您不想允许除and之外的任何其他关键字参数,那么您也可以使用适当的子集测试。仅当左侧集合严格小于右侧集合时,使用两个集合才是 True;它只有比另一组更少的键,并且没有额外的键:dollar
euro
<
if {}.viewkeys() < kargs.viewkeys() < {'dollar', 'euro'}:
raise ValueError('One keyword argument is required: dollar=x or euro=x')
在 Python 3 上,可以拼写为:
if set() < kargs.keys() < {'dollar', 'euro'}:
反而。
演示:
>>> kargs = {'dollar': 1, 'euro': 3, 'foo': 'bar'}
>>> {}.viewkeys() < kargs.viewkeys() < {'dollar', 'euro'}
False
>>> del kargs['foo']
>>> {}.viewkeys() < kargs.viewkeys() < {'dollar', 'euro'}
False
>>> del kargs['dollar']
>>> {}.viewkeys() < kargs.viewkeys() < {'dollar', 'euro'}
True
>>> del kargs['euro']
>>> {}.viewkeys() < kargs.viewkeys() < {'dollar', 'euro'}
False
请注意,现在'foo'
密钥不再可接受。