我同意 using**kwargs
是一个好主意,您可以使用一组轻松地清理它的键。我使用的是 Python 2.6,所以我没有集合理解,但我的代码应该很容易翻译成更现代的版本。
FWIW,实际上我昨晚很晚才发布了这个程序的一个版本,但后来我认为它应该对错误的参数做一些事情,所以我暂时删除了它。这是修改后的版本。
验证参数.py
#! /usr/bin/env python
''' Validate the keys in kwargs
Test keys against a container (set, tuple, list) of good keys,
supplying a value of None for missing keys
Also, if a key ends with an underscore, strip it.
Written by PM 2Ring 2014.11.15
From
http://stackoverflow.com/questions/26945235/best-practice-handle-functions-with-lots-of-parameters-and-reserved-names
'''
import sys
def test(**kwargs):
good_keys = ("container", "class_", "color",
"vassal", "level", "line", "filename",
"func", "with_total", "range")
new_kwargs = validate_keys(kwargs, good_keys)
for t in new_kwargs.items():
print "%-12s : %r" % t
#def alarms(**kwargs):
#good_keys = ("container", "class_", "color",
#"vassal", "level", "line", "filename",
#"func", "with_total", "range")
#return self.get('alarms', validate_keys(kwargs, good_keys))
def validate_keys(kwargs, good_keys):
good_keys = set(good_keys)
bad_keys = set(kwargs.keys()) - good_keys
if bad_keys:
bad_keys = ', '.join(bad_keys)
print >>sys.stderr, "Unknown parameters: %s\n" % bad_keys
raise KeyError, bad_keys
new_kwargs = {}
for k in good_keys:
new_kwargs[k.rstrip('_')] = kwargs.get(k, None)
return new_kwargs
test(color="red", class_="top",
#bar=1, foo=3, #Some bad keys
level=2, func="copy",filename="text.txt")
输出
container : None
with_total : None
level : 2
color : 'red'
filename : 'text.txt'
vassal : None
range : None
func : 'copy'
line : None
class : 'top'