【问题标题】:Is there a cleaner way to pass kwargs from class to a function有没有更简洁的方法将 kwargs 从类传递给函数
【发布时间】:2021-08-21 17:16:21
【问题描述】:

我刚刚开始在 python 类中使用 kwargs,我相信这是一个微不足道的问题,但我在网上找不到足够的答案。

我有一个类,它的配置值在许多函数中使用,但是有 一些调用,其中的值必须被否决

这是我在冗长上下文中的问题的简化版本:

我的要求是:

  1. 如果没有另外声明,verbose 将成为配置值
test().func() -> "Verbose = True"
  1. verbose 成为在初始化时传递给类的 kwarg。
test(verbose=False).func() -> "Verbose = False"
  1. verbose 成为在 func 调用时传递给函数的 kwarg。
test().func(verbose=False) -> "Verbose = False"
  1. (可选但不是必需的,甚至会牺牲额外的复杂性): 即使没有初始化,verbose 也会变成配置
test.func() -> "Verbose = True"

我的解决方案:

class test():

    CONFIG = {"verbose":True}

    def __init__(self,**kwargs):
        self.__dict__.update(self.CONFIG)
        self.__dict__.update(**kwargs)
    
        
    def func(self=None,**kwargs):
        verbose = kwargs['verbose'] if 'verbose' in kwargs else self.verbose
        print(f"Verbose = {verbose}")

我的问题: 这似乎不是解决问题的正确方法。这似乎是一种复杂的处理方式,感觉就像我缺少一个内置或标准的解决方案。一个更大的问题是我不喜欢这样,我必须为每个变量和每个我想这样处理的函数做这样的一行。

谢谢

【问题讨论】:

    标签: python python-class


    【解决方案1】:

    您可以将get() 方法与默认值一起使用。

    def funct(self, **kwargs):
        verbose = kwargs.get('verbose', self.verbose)
        print(f"Verbose = {verbose}")
    

    顺便说一句,self 不需要默认值,因为这个参数总是自动传递给方法。

    【讨论】:

    • 谢谢。当您的意思是不需要 self 的默认值时,您是指 self=None 吗?我经常以一种我可以在不启动类的情况下调用它们的方式编写我的方法(用于类似的项目)。这样在定义 def method1(self=None,arg1): 时,可以用 class1.method1(arg1) 调用它。除了我自己的代码之外,我从未在任何地方看到过这种情况。你认为这是不切实际还是错误的?
    • 是的,这就是我所指的。我也没有看到这种模式。如果该方法不需要self 参数,则应将其定义为@staticmethod@classmethod
    【解决方案2】:

    我相信这就是您正在寻找的:

    class test():
        # A class variable will act as a default value for objects.
        verbose = True
    
        def __init__(self,**kwargs):
            # It's better to use setattr. Modifying __dict__ might bypass some
            # important automated stuff.
            for k, v in kwargs.items():
                setattr(self, k, v)
        
        # self must not be None. 'None.verbose' is an error.
        def func(self, **kwargs):
            # Use the get method when the value might not be in the dict.
            verbose = kwargs.get('verbose', self.verbose)
            print(f"Verbose = {verbose}")
    

    【讨论】:

    • 也谢谢你,这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    相关资源
    最近更新 更多