python - 防止变量关键字参数中的拼写错误

标签 python python-2.x variadic-functions keyword-argument

在 Python3 中我可以做到(感谢 pep 3102 ):

def some_fun(a, *args, log=None, verbose=0):
    pass

并确保如果我用以下方式调用它:

some_fun(1, 2, 3, lob=debug_log)

我在意外关键字参数 lob 上收到类型错误。

在 Python2 上,我无法在任意参数列表之后使用仅关键字参数定义 some_fun() 。我要做的是:

def some_fun(a, *args, **kw):
    log  = kw.get("log", None)
    verbose = kw.get("verbose", 0)

当正确调用时,这一切都很好,但是当我向 some_fun() 提供一个或多个错误的关键字参数时,我希望得到一个类型错误,就像 Python3 一样。

最佳答案

不要使用 .get() 来检索值,而是使用 .pop() 并在弹出所有内容后检查 kw 是否为空仅关键字参数。

我为此使用了一个小辅助函数:

def check_empty_kwargs(kwargs):
   import inspect
   try:
      keys = kwargs.keys()
      assert len(keys) == 0
   except AssertionError:
      # uncomment if you want only one of the unexpected kwargs in the msg
      # keys = keys[:1]
      msg = "{0}() got an unexpected keyword argument{1} {2}".format(
         inspect.stack()[1][3], # caller name
         's' if len(keys) > 1 else '',
         ', '.join(["'{0}'".format(k) for k in keys]))
      raise TypeError(msg)

你会这样使用它:

def some_fun(a, *args, **kw):
    log  = kw.pop("log", None)
    verbose = kw.pop("verbose", 0)
    check_empty_kwargs(kw)

调用它(假设定义了debug_log)

some_fun(1, 2, 3, lob=debug_log)
....
TypeError: some_fun() got an unexpected keyword argument 'lob'

回溯(当然)与Python3不同

关于python - 防止变量关键字参数中的拼写错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28260559/

相关文章:

java - 使用可变参数时出现意外行为 - java

python - ModelViewSet API 端点是什么

python - 如何使用类列表作为函数参数?

python - Flask 中的自定义身份验证和参数检查

python - 将Unicode文本写入文本文件?

c - 使用 gcc 编译一个显示 "undefined reference to ` 中止的项目'”

使用数组作为可变参数函数的最后一个命名参数会导致缓冲区欠载吗?

python - NumPy Einsum 的黑巫术

python 27 - 多处理时 boolean 检查失败

python - 在 Python2.x 中使用 print()(函数版本)