gpt4 book ai didi

Python:按名称传递条件参数

转载 作者:行者123 更新时间:2023-11-30 23:24:29 25 4
gpt4 key购买 nike

我有很多函数,其中一些需要 bar 参数,有些需要 foo 参数,有些不需要,有些则两者都需要.

我希望从同一位置调用所有这些函数,因为该函数是从变量引用的。

我找到的可能的解决方案是:

  1. function(bar = "some_value", foo = "其他值")
  2. 使用检查,然后检测需要传入哪些参数

我不相信#1 会起作用,但我知道#2 会。有没有一种 native (不使用库)方法可以让我做到这一点?

举个例子:

functions = [lambda foo: foo.do_something(),
lambda bar: bar.do_something_else(),
lambda foo, bar: foo.something_with_bar(bar),
lambda: do_another_task()
]
for function in functions:
//call goes here

注意:实际上我有很多很多函数想要使用这些参数来调用,并且它们并没有全部很好地存储在数组中。如果我能在不改变函数本身的情况下做到这一点,我会更愿意。

最佳答案

您最好将lambda 表达式存储在变量中,而不是底层函数中,并将参数绑定(bind)在 lambda 中。像这样的东西:

foo = 'foo'
bar = 'bar'
if funcname == 'a':
func = a # a takes no args
elif funcname == 'b':
func = lambda: bb(bar=bar) # bb takes bar
elif funcname == 'c':
func = lambda: ccc(foo=foo) # ccc takes foo
# call it, uniformly
func()

类似的方法是“解除绑定(bind)”:

if funcname == 'a':
func = lambda foo, bar: a() # don't pass foo and bar
elif funcname == 'b':
func = lambda foo, bar: bb(bar=bar) # don't pass foo
elif funcname == 'c':
func = lambda foo, bar: ccc(foo=foo) # don't pass bar
# call it, uniformly
func(foo, bar)
<小时/>

此外,如果您想重构代码以使其更加优雅和面向对象,请定义接口(interface)和外观实现:

class FooBarInterface(object):
def f(self, foo, bar):
raise NotImplementedError
class A(FooBarInterface):
def f(self, foo, bar):
return a()
class B(FooBarInterface):
def f(self, foo, bar):
return bb(bar=bar)
class C(FooBarInterface):
def f(self, foo, bar):
return ccc(foo=foo)

if funcname == 'a':
obj = A()
elif funcname == 'b':
obj = B()
elif funcname == 'c':
obj = C()
# call it, uniformly
obj.f()
<小时/>

请不要使用内省(introspection)。这会让你的代码变得比需要的更加复杂。

关于Python:按名称传递条件参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23395743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com