有没有一种优雅的方法可以将具有不同数量参数的多个函数传递给 python 中的另一个函数?
Is there an elegant way to pass multiple functions with different amount of parameters into another function in python?
这个代码块看起来非常相似,我正在寻找一种方法来从它们两个创建一个函数:
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"))
但是变量 frozen_poco 和 guardian 仅在函数内部定义,而不是在调用函数时定义,因此代码不会 运行。我还尝试对函数内的变量进行解包和重新打包,但它大大减慢了 运行 时间。我知道应该有一个优雅的解决方案,但我不知道是什么
您的回调函数可以将 frozen_poco 和 guardian,或 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)
它应该像那样工作,尽管这意味着灵活性降低(因为 frozen_poco-stuff 将始终是第一个参数,但对于您的示例来说这就足够了)。
def custom_assert(func1, pocoarg1, func1Args, func2, pocoarg2, func2Args):
guardians = ["guardianPogchamp", "guardianKappa", "guardianKappaPride", "guardianSmorc", "guardianTrihard"]
with pocofixtures.poco.freeze() as frozen_poco:
for guardian in guardians:
if guardian == 'guardianLul':
func1(frozen_poco(guardian).offspring(pocoarg1), *func1Args)
else:
func2(frozen_poco(guardian).offspring(pocoarg2), *func2Args)
custom_assert(assert_text_equal, "countdown", ["Immune"], assert_text_match, "countdown",["Not Immune"])
custom_assert(assert_visible, "PetContainer", [], assert_not_visible, "PetContainer", [])
这个代码块看起来非常相似,我正在寻找一种方法来从它们两个创建一个函数:
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"))
但是变量 frozen_poco 和 guardian 仅在函数内部定义,而不是在调用函数时定义,因此代码不会 运行。我还尝试对函数内的变量进行解包和重新打包,但它大大减慢了 运行 时间。我知道应该有一个优雅的解决方案,但我不知道是什么
您的回调函数可以将 frozen_poco 和 guardian,或 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)
它应该像那样工作,尽管这意味着灵活性降低(因为 frozen_poco-stuff 将始终是第一个参数,但对于您的示例来说这就足够了)。
def custom_assert(func1, pocoarg1, func1Args, func2, pocoarg2, func2Args):
guardians = ["guardianPogchamp", "guardianKappa", "guardianKappaPride", "guardianSmorc", "guardianTrihard"]
with pocofixtures.poco.freeze() as frozen_poco:
for guardian in guardians:
if guardian == 'guardianLul':
func1(frozen_poco(guardian).offspring(pocoarg1), *func1Args)
else:
func2(frozen_poco(guardian).offspring(pocoarg2), *func2Args)
custom_assert(assert_text_equal, "countdown", ["Immune"], assert_text_match, "countdown",["Not Immune"])
custom_assert(assert_visible, "PetContainer", [], assert_not_visible, "PetContainer", [])