在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中执行此操作的惯用方法是什么?
答案 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]:
您只需为关键字参数指定一个值即可。请注意,这实际上可以在以后派上用场,但如果你真的不需要它,那就不太好了。