可选,但条件参数蟒蛇
所以我们可以说我有一个函数,它接受两个参数,但其中至少有一个应该存在:可选,但条件参数蟒蛇
def foo_bar(foo = None, bar = None):
的问题是,他们两个都是可选的,但在实践中无论是foo
或bar
将被传递 现在,我在这样的功能检查是否存在:
do_this() if foo else do_that() sort of logic..
但我不喜欢这样的样子。
处理这个问题的最佳方法是什么?
我想你说得对。该PARAMS也可以与kwargs
语法阅读:
def foo(*args, **kwargs):
if 'foo' in args:
do_this()
elif 'bar' in args:
do_that()
else:
raise ValueError()
或者,你可以做这样的事情:
def foo(param, flag):
if flag == 'foo':
do_this()
elif flag == 'bar':
do_that()
else:
raise ValueError()
无论哪种方式应该罚款。希望这有助于
不知道** kwargs版本与原始版本相比有什么更好的...我喜欢param/flag版本。 – weronika 2012-08-28 23:14:38
它像你说的标志一样工作。它也可以让参数以任何(基本上无序)的顺序传递。 “dict”的键/值对成为params传递(和解析)的方式,而不是参数的位置传递,而函数签名是def foo(param1,param2,...)'会发生什么情况。另外,查看[这个其他SO问题]的答案(http:// *。com/questions/3394835/args-and-kwargs) – inspectorG4dget 2012-08-29 02:40:43
我知道这是如何工作的,但是像'def foo(x,y,z)'这样的签名,你也可以*按名称以任意顺序传递参数(' foo(z = 1,x = 2,y = 3)'),这就是为什么我不确定在这种情况下'** kwargs'签名有什么优势。 – weronika 2012-09-07 00:00:56
为什么不简单地检查看哪一个是无,并且说另一个必须是存在的那个?
if foo == None:
do bar()
elif bar == None:
do foo()
else:
throwUpYourHandsInFrustration()
他已经在做这种检查。 – 2012-07-26 17:20:30
3种方式来对付它浮现在脑海中:
如果你可以切换基于有关参数的一些规则的行为(其中一个是一个类型,一个是另一个,一个1个正则表达式匹配, 1另一个等),传递一个参数并找出该函数内部要做什么。
创建2个函数,这两个函数都为其共享行为调用某个其他函数,但独立处理foo和bar特定情况。
通1数据值和另一控制值:
def foo_bar(val, control):
if control=='foo':
#Do foo stuff
elif control=='bar':
#Do bar stuff
你是在正确的轨道上,但如果两者都指定什么?我通常做的是:
def some_func(foo=None, bar=None):
"either one, or neither, but not both, are allowed"
if foo is not None and bar is not None:
raise TypeError("cannot specify both 'foo' and 'bar'")
if foo is not None:
pram = foo
elif bar is not None:
pram = bar
else:
pram = None # or whatever
简单,容易理解。
你有没有想过使用关键字参数? – 2012-07-26 17:18:31
@JoelCornett:OP正在使用关键字参数。 – 2012-07-26 17:18:59
@SvenMarnach:我的意思是'** kwargs'。 – 2012-07-26 17:21:24