是否有一种优雅的方法将带有不同数量参数的多个函数传递给python中的另一个函数?

问题描述 投票:0回答:1

此代码块看起来非常相似,我正在寻找一种从它们两者中创建一个函数的方法:

guardians = ["guardianPogchamp", "guardianKappa", "guardianKappaPride", "guardianSmorc", "guardianTrihard"]

with pocofixtures.poco.freeze() as frozen_poco:
    for guardian in guardians:
        if guardian == 'guardianLul':
            assert_text_equal(frozen_poco(guardian).offspring("countdown"),"Immune")
        else:
            assert_text_match(frozen_poco(guardian).offspring("countdown"),"Not Immune")

with pocofixtures.poco.freeze() as frozen_poco:
    for guardian in guardians:
        if guardian == 'guardianLul':
            assert_visible(frozen_poco(guardian).offspring("PetContainer"))
        else:
            assert_not_visible(frozen_poco(guardian).offspring("PetContainer"))

这是我尝试过的解决方案之一:

def custom_assert(func1, func1Args, func2, func2Args):
    guardians = ["guardianPogchamp", "guardianKappa", "guardianKappaPride", "guardianSmorc", "guardianTrihard"]

    with pocofixtures.poco.freeze() as frozen_poco:
        for guardian in guardians:
            if guardian == 'guardianLul':
                func1(*func1Args)
            else:
                func2(*func2Args)

custom_assert(assert_text_equal, (frozen_poco(guardian).offspring("countdown"), "Immune") , assert_text_match, (frozen_poco(guardian).offspring("countdown"),"Not Immune"))
custom_assert(assert_visible, frozen_poco(guardian).offspring("PetContainer"), assert_not_visible, frozen_poco(guardian).offspring("PetContainer"))

但是变量freeze_poco和guardian仅在函数内部定义,而不是在调用时定义,因此代码不会运行。我还尝试对函数内部的变量进行解压缩和重新打包,但这会大大降低运行时间。我知道应该对此有一个优雅的解决方案,但我不知道]

python functional-programming contextmanager
1个回答
0
投票

您的回调函数可以将Frozen_poco和监护人,或Frozen_poco(guardian)作为参数:

custom_assert(
    lambda fp, g: assert_text_equal(fp(g).offspring("countdown"), "Immune") ,
    lambda fp, g: assert_text_match(fp(g).offspring("countdown"),"Not Immune"))

和这样叫:

func1(frozen_poco, guardian)
func2(frozen_poco, guardian)
© www.soinside.com 2019 - 2024. All rights reserved.