【问题标题】:Python **kwargs and self as an argumentPython **kwargs 和 self 作为参数
【发布时间】:2012-12-29 19:11:57
【问题描述】:

我没有太多的python经验,但我正在学习**kwargs

阅读了很多内容后,我了解了一些关于 **kwargs 的内容,但我有一个小问题我没有理解正确的内容。

所以这有效

def test_var_kwargs(farg, **kwargs):
    print "formal arg:", farg
    for key in kwargs:
        print "another keyword arg: %s: %s" % (key, kwargs[key])

test_var_kwargs(farg=1, myarg2="two", myarg3=3)

然后打印:

正式参数:1

另一个关键字arg:myarg2:二

另一个关键字arg:myarg3:3

但如果该函数是实例函数,则必须包含self

def test_var_kwargs(self, farg, **kwargs):
        print "formal arg:", farg
        for key in kwargs:
            print "another keyword arg: %s: %s" % (key, kwargs[key])
    
self.test_var_kwargs(farg=1, myarg2="two", myarg3=3)

但这会产生一个错误

TypeError: test_var_kwargs() takes exactly 2 arguments (1 given)

我明白我必须像这样传递自我:

self.test_var_kwargs(self, farg=1, myarg2="two", myarg3=3)

为什么我必须在类实例的方法中包含 self 作为参数?

【问题讨论】:

  • 能否包含类函数示例的完整代码示例。我想你可能误会了。
  • 无需通过frag=1。只需将其传递为1
  • 因为它仅将 farg=1 视为关键字参数。
  • @Wessie 不会误解课程。这不是重点

标签: python python-2.7 arguments keyword-argument


【解决方案1】:

在这种情况下,您不能使用farg 作为关键字参数;它不能同时解释为位置 关键字参数,在这种情况下,Python 将其解释为关键字参数。

使用

self.test_var_kwargs(self, 1, myarg2="two", myarg3=3)

改为。

函数充当描述符;当在一个实例上查找时,它们会被包装在一个称为方法的新对象中,该方法会在调用时自动将该实例作为第一个参数添加到函数中。这个包装器本质上是这样做的:

class Method(object):
    def __init__(self, function, instance, cls):
        self.func = function
        self.instance = instance
        self.cls = cls

    def __call__(self, *args, **kw):
        return self.func(self.instance, *args, **kw)

您的 farg 关键字参数然后集中在 **kw 总括下并传递给底层函数,*args 留空。

但是您定义的test_var_kwargs 方法有一个位置参数(在self 旁边,因此会引发异常。

【讨论】:

  • 但是为什么我要在参数中包含 self 呢?
  • 在我看来,farg 不会同时被解释为位置参数和关键字参数。使用正确的类/对象语法,我的机器会产生预期的结果。
  • 实例方法的定义只需要包含“self”即可。在调用方法时,您永远不必包含对 self 的引用,这是为您隐式完成的。
  • @KyleStrand:这是我的措辞错误,已更新为扩展答案。
  • 谢谢。终于。也感谢@ZoranPavlovic
猜你喜欢
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 2021-03-12
  • 2017-10-26
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
相关资源
最近更新 更多