将选项传递给函数

时间:2018-05-10 12:09:19

标签: python

在ruby中,编写一个可以像这样调用的函数是惯用的:

open_database(:readonly) // or
open_database(:readonly, :remote, :force)

在这些情况下:readonly是"符号"并被用作"标志"修改open_database调用的行为。

我们将在ruby中实现如下:

def func(*params)
  if params.include? :readonly
    puts "readonly"
  end
end

在Python中执行此操作的惯用方法是什么?

2 个答案:

答案 0 :(得分:8)

Python上没有这样的语法糖。

执行此操作的正确方法是使用默认关键字参数:

def open_database(readonly=False, remote=False, force=False):
   # ...

然后你可以:

open_database(readonly=True, force=True) # remote=False (default)

如果你想尽可能接近ruby,你可以做参数解包:

def specify_flags(*args):
    return {x: True for x in args}

open_database(**specify_flags('readonly', 'force')) # Same as readonly=True, force=True

答案 1 :(得分:0)

你可以这样做,这几乎就是你想要的:

In [1]: def open_database(**kwargs):
   ...:     if 'readonly' in kwargs:
   ...:         print 'Setting up read only'
   ...:     if 'remote' in kwargs:
   ...:         print 'Setting up remote'
   ...:         

In [2]: open_database()

In [3]: open_database(remote=0)
Setting up remote

In [4]: 

您只需为关键字参数指定一个值即可。请注意,这实际上可以在以后派上用场,但如果你真的不需要它,那就不太好了。