【问题标题】:Kwargs with method raises a TypeError带有方法的 Kwargs 引发 TypeError
【发布时间】:2015-01-17 17:53:04
【问题描述】:

我尝试在方法参数中使用**kwargs,这是我的代码:

class TextFormatter:
def format(self, text, **key_vals):
    injected_text = text
    return injected_text;



formatter = TextFormatter()
print(formatter.format("test", { "p1" : "t1", "p2" : "t2"}))

很遗憾,我收到了这个错误:

    print(formatter.format("test", { "p1" : "t1", "p2" : "t2"}))
  TypeError: format() takes 2 positional arguments but 3 were given

你知道我的代码有什么问题吗?

【问题讨论】:

    标签: python function arguments keyword-argument


    【解决方案1】:

    您的TextFormatter.format 方法采用三个参数:

    1. self,这是一个隐式传递的位置参数。
    2. text,这是另一个位置参数。
    3. **key_vals,它收集任何额外的关键字参数。

    这意味着您的方法只接受 2 个位置参数。但是你给它 3(self"test" 和字典 { "p1" : "t1", "p2" : "t2"})。这样做会引发TypeError


    要解决这个问题,你需要在使用**传递字典时解包:

    print(formatter.format("test", **{ "p1" : "t1", "p2" : "t2"}))
    

    或者,您可以直接传递关键字参数:

    print(formatter.format("test", p1="t1", p2="t2"))
    

    【讨论】:

    • 虽然您是绝对正确的,但将其称为print(formatter.format("test", p1="t1", p2="t2")) 可能会更易读。
    • 还有其他方法可以将 key:value 放入方法参数中吗?我不能像 **{"key":"value"} 那样用星号来调用它。我必须像 {"key":"value"} 这样调用。
    • @flamaster09 - 那么您可以将key_vals 设为位置参数:def format(self, text, key_vals):
    猜你喜欢
    • 2021-08-11
    • 2023-03-05
    • 2017-04-17
    • 2012-12-06
    • 2012-05-24
    • 1970-01-01
    • 2010-09-28
    • 2019-09-14
    • 2012-10-20
    相关资源
    最近更新 更多