2012-07-26 97 views
0

所以我们可以说我有一个函数,它接受两个参数,但其中至少有一个应该存在:可选,但条件参数蟒蛇

def foo_bar(foo = None, bar = None): 

的问题是,他们两个都是可选的,但在实践中无论是foobar将被传递 现在,我在这样的功能检查是否存在:

do_this() if foo else do_that() sort of logic.. 

但我不喜欢这样的样子。

处理这个问题的最佳方法是什么?

+0

你有没有想过使用关键字参数? – 2012-07-26 17:18:31

+3

@JoelCornett:OP正在使用关键字参数。 – 2012-07-26 17:18:59

+0

@SvenMarnach:我的意思是'** kwargs'。 – 2012-07-26 17:21:24

回答

4

我想你说得对。该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() 

无论哪种方式应该罚款。希望这有助于

+0

不知道** kwargs版本与原始版本相比有什么更好的...我喜欢param/flag版本。 – weronika 2012-08-28 23:14:38

+0

它像你说的标志一样工作。它也可以让参数以任何(基本上无序)的顺序传递。 “dict”的键/值对成为params传递(和解析)的方式,而不是参数的位置传递,而函数签名是def foo(param1,param2,...)'会发生什么情况。另外,查看[这个其他SO问题]的答案(http:// stackoverflow。com/questions/3394835/args-and-kwargs) – inspectorG4dget 2012-08-29 02:40:43

+0

我知道这是如何工作的,但是像'def foo(x,y,z)'这样的签名,你也可以*按名称以任意顺序传递参数(' foo(z = 1,x = 2,y = 3)'),这就是为什么我不确定在这种情况下'** kwargs'签名有什么优势。 – weronika 2012-09-07 00:00:56

0

为什么不简单地检查看哪一个是无,并且说另一个必须是存在的那个?

if foo == None: 
    do bar() 
elif bar == None: 
    do foo() 
else: 
    throwUpYourHandsInFrustration() 
+1

他已经在做这种检查。 – 2012-07-26 17:20:30

2

3种方式来对付它浮现在脑海中:

如果你可以切换基于有关参数的一些规则的行为(其中一个是一个类型,一个是另一个,一个1个正则表达式匹配, 1另一个等),传递一个参数并找出该函数内部要做什么。

创建2个函数,这两个函数都为其共享行为调用某个其他函数,但独立处理foo和bar特定情况。

通1数据值和另一控制值:

def foo_bar(val, control): 
    if control=='foo': 
     #Do foo stuff 
    elif control=='bar': 
     #Do bar stuff 
2

你是在正确的轨道上,但如果两者都指定什么?我通常做的是:

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 

简单,容易理解。