有没有办法解决来自 __init__ 的“赋值前引用的局部变量 'kwargs'”?

Is there a way to solve 'local variable 'kwargs' referenced before assignment' from __init__?

我有一个 Class 接受 **kwargs。我希望能够在 class 内的函数中使用它。 我看过其他的解决方案,说必须使用 return self.kwargs,但我不确定我必须在哪里做(在函数之外,或者在函数内部但在最后)

class Foo():
    def __init__(self, name:str, **kwargs):
        self.name = name
        self.kwargs = kwargs
        # print(kwargs/self.kwargs) returns the dictionary as I expected

    ## There's an __enter__ and __exit__ that does nothing, just returns self

    def show():
        if kwargs:
            print(name, f"{key} and {value}" for key, value in self.kwargs.items())    # Using kwargs.items() didn't work too

        else:
            print(name)

        return self.kwargs

然后我做了:

with Foo('some_name', foo='bar', foo_bar='baz') as f:
    f.show()

我得到的错误是:

  File "/...", line 73, in <module>
    f.show()
  File "/...", line 96, in show
    if kwargs:
UnboundLocalError: local variable 'kwargs' referenced before assignment

我做错了什么?

谢谢。

有些事情是错误的。首先,该函数没有将 class 实例 self 传递给它。其次,if 语句应该是 if self.kwargs。这是访问实例的 kwargs 变量。

def show(self):
        if self.kwargs:
            print(name, f"{key} and {value}" for key, value in self.kwargs.items())    # Using kwargs.items() didn't work too

        else:
            print(name)

        return self.kwargs

看起来有两个错误:

您的方法定义需要包含 self,此后您可以从 'self'.

访问实例变量(您的 kwargs)
def show(self):
    if self.kwargs...

当您实例化一个新对象实例时 FooInstance = Foo('John',...),您会为该实例创建新变量。 Foo class 的所有需要​​实例变量的方法都需要传入一个参数,按照惯例称为 self 。然后,您可以在这些方法中使用 self 关键字访问实例变量。

打印语句看起来也不对,您可能需要这个

print(f"{self.name} {key} and {value}" for key, value in self.kwargs.items())

最后,我认为您在这里不需要 with ... as 上下文管理器。像这样比较合适。

myobj =  Foo(...)
myobj.show()