Python数据扩展-使用getattr调用基于名称字符串的函数



这是一个我觉得非常有用的小教程。这是许多问题的汇编,例如,你可以在这里找到。我试着把它应用到现实世界的场景中,让它更容易理解


让我们想象一下,我们有一个想要丰富的数据集。要做到这一点,我们将数据分组,并在每个分组上应用不同的函数。有很多方法可以做到这一点。

其中一种方法是根据名称调用函数。这里我们有class Test,它可以调用foobar
注意:foobar也可以是Test的方法

在类之外,我们可以直接调用方法:

def foo(s="Nothing"):
print("this is foo")
print(""{}" was given as arg".format(s))

def bar(s="Nothing"):
print("this is bar")
print(""{}" was given as arg".format(s))
class Test():
def __init__(self):
self.a = foo
self.b = bar
t = Test()
t.a("Hello World")

这导致:

>>> this is foo
>>> "Hello World" was given as arg

但是,如果您必须调用的方法取决于您的数据所属的组,您会怎么办?我们可以有两组:onetwo

那么你可以创建一个条件循环。。。像这样:

group = "one"
if group == "one":
t.a("Hello World")
else:
t.b("Hello Moon")

太好了,真管用!

现在让我们想象一下,我们的数据可能属于50多个组
你能想象有50个if ... else if语句的代码吗?

上面的选项将非常不可读。这就是为什么有一种方法可以将基于Name的函数作为字符串进行调用
这里有一种方法:

创建一个字典,保存需要应用于每个组的不同函数。

function_dict = {
"one": "a",
"two": "b"
}

然后我们使用getattr内置函数根据组调用函数:

def launchFunction(blah):
getattr(t, function_dict[blah])("This Works Too")

这允许我们基于function_dict密钥调用foobar

launchFunction("two")

这将导致:

>>> this is bar
>>> "This Works Too" was given as arg

我希望这对某人有用
欢迎发表评论。

相关内容

最新更新