2012-03-01 55 views
6

我有一个Python函数,它需要一些参数,其中之一是要执行的模拟类型。例如,选项可能是“太阳”,“查看”或“既Pythonic方式有2-3个选项作为参数的选择

什么是Python化的方式,允许用户设置这些

我可以看到各种选项:?

  1. 使用一个字符串变量,并检查它 - 所以这将是func(a, b, c, type='solar')

  2. 在类集合一些常量和使用func(a, b, c, type=classname.SOLAR)

  3. 如果只有两个选项(就像我的一些函数一样)将其强制为True/False参数,通过使用类似func(a, b, c, do_solar=False)的内容让它使用'view'选项。

Pythonic这样做的任何偏好(或其他想法)?

+2

你不应该使用'type'作为参数名,因为这是一个内置的... – 2012-03-01 19:53:45

回答

3

我不喜欢任何这些选项。

我会定义两个不同的函数,perform_solar(a, b, c)perform_view(a, b, c),让调用者根据哪个参数决定要使用哪个函数。

如果你认为你不得不将它们打包成一个单一函数的原因是它们共享状态,你应该在一个对象中共享该状态并将函数定义为方法。

1

您可以使用可选的(关键字)参数这样

def func(a, b, c, **kw): 
    if kw.get('do_solar'): 
     # Do Solar 
    if kw.get('do_view'): 
     # Do view 
3

如果点尼克拉斯在his answer使不成立,我会用一个字符串参数。标准库中有Python模块使用类似的参数。例如csv.reader()

sim_func(a, b, c, sim_type='solar') 

记得给的功能,帮助人们,如果他们在错误的东西里面键入一个合理的误差。

def sim_func(a, b, c, sim_type='solar'): 
    sim_types = ['solar', 'view', 'both'] 
    if sim_type not in sim_types: 
     raise ValueError("Invalid sim type. Expected one of: %s" % sim_types) 
    ... 
2

由于功能是Python对象,你实际上可以处理* ARGS作为方法的列表并通过类型的模拟作为结尾arbitratry ARGS。这将有利于您在将来定义新的模拟而不必重构此代码。

def func(a, b, c, *args): 
    for arg in args: 
     arg(a, b, c) 

def foosim(a, b, c): 
    print 'foosim %d' % (a + b + c) 

def barsim(a, b, c): 
    print 'barsim %d' % (a * b * c) 

用途:

func(2, 2, 3, foosim) 
func(2, 2, 3, barsim) 
func(2, 2, 3, foosim, barsim) 

输出:

foosim 7 
barsim 12 
foosim 7 
barsim 12