【问题标题】:Use a dict as input to a function but only take arguments that the function needs使用 dict 作为函数的输入,但只接受函数需要的参数
【发布时间】:2020-06-23 17:59:00
【问题描述】:

我正在研究数据科学,我有一个相当大的脚本,其中包含许多帮助函数来对 pandas 数据帧进行分析,然后是一个利用我的函数来获得一些结果的主要函数。

问题是大多数或函数输入只是数据框中列的名称(因为它们被视为来自用户的输入),这导致许多函数具有部分相同的输入。

我想知道是否有可能有一个包含我所有参数的字典,并且只需将字典传递给每个函数而不修改字典?也就是说,每个函数都必须忽略 dict 中不是该特定函数输入的关键字。

举个例子说我有这个功能。

    def func1(a, b, c):
        return a + b * c

我有这个字典,其中包含我所有函数的输入。

    input_dict = {'a': 1,
                 'b': 2,
                 'c': 3,
                 'd': 4}

如果我用这个字典作为输入调用这个函数:

    value = func1(**input_dict)

由于意外的参数 d,我会得到一个错误。

这里有什么不涉及更改字典的解决方法吗?我的代码有效,但我希望避免到处都有如此多的重复输入参数。

提前谢谢:)

【问题讨论】:

标签: python dictionary data-science


【解决方案1】:

我想知道是否有可能有一个包含我所有参数的字典,并且只需将字典传递给每个函数而不修改字典?

这是对一个类的用例的一个很好的总结。

from operator import attrgetter


class Foo:
    def __init__(self, a, b, c, d):
        self.a = a
        self.b = b
        self.c = c
        self.d = d

    def func1(self):
        a, b, c = attrgetter('a', 'b', 'c')(self)
        return a + b * c

f = Foo(1, 2, 3, 4)

value = f.func1()

您的类的实例替换了input_dict。每个帮手 函数成为实例方法,其定义使用 只有它需要的那些实例属性。

我对@9​​87654323@ 的使用只是帮助将现有函数迁移到方法中的建议,因为它不需要分散一堆 对self 的引用自始至终。您可以将func1 简单定义为

def func1(self):
    return self.a + self.b * self.c

【讨论】:

  • 是的,我最初的想法实际上是将其迁移到基于类的结构上,而我的问题基本上是我试图解决这个问题。当我最初制作这个脚本时,我不知道它会被放大多少,并且它会包含这么多功能。我想可能值得花一些时间迁移它,感谢您的输入:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 2020-04-22
  • 2015-08-02
  • 1970-01-01
  • 2022-01-15
  • 2017-08-11
相关资源
最近更新 更多