首先提一下,我的代码有效,我只是觉得,我可以做得更高效。但是如何?
我有一个例程(可选和标准给定)参数:
def read(fpath = 'C:', fname = 'text.txt')
后来我调用了这个函数,并逐个显示了所显示函数的不同参数:
def get(index, path=None, name=None):
if path == None:
if name == None:
elements = read()
else:
elements = read(fname=name)
else:
if name == None:
elements = read(fpath=path)
else:
elements = read(fpath=path,fname=name)
如何在不丢失代码清晰度的情况下缩短编写时间?
谢谢。
PS:这是我的第一个问题,如果我错过了规则,请纠正我。我正在学习。
答案 0 :(得分:2)
您可以修改read
的定义以使用相同的参数名称,然后您可以直接调用它。
def read(path=None, name=None):
print(path)
print(name)
return 'something usefull'
def get(index, **kwargs):
elements = read(**kwargs)
get(0, path='a path', name='a name')
# a path
# a name
您可以在path=None, name=None
的定义中提供实际的默认值,而不是read
,除非它们是可变的。
答案 1 :(得分:1)
您可以使用字典并使用关键字参数:
def get(index, path = None, name = None):
kwargs = {}
if path is not None:
kwargs['path'] = path
if name is not None:
kwargs['name'] = name
elements = read(**kwargs)
或者,如果您只想过滤掉所有参数的None
:
def get(index, path = None, name = None):
kwargs = dict(path = path, name = name)
elements = read(**{k:v for k,v in kwargs.items() if v is not None})
然而,我想知道,如果使用相同的默认值通过将默认值传递给用户,是否会更好。由于用户会注意到奇怪的行为。所以我的建议是使用:
def read(index, fpath = 'C:', fname = 'text.txt'):
elements = read(fpath=fpath,fname=fname)
从现在开始,用户可以从类型签名中看到如果他/她没有提供某个参数会发生什么。您也可以传递**kwargs
,在这种情况下,提供给get
的参数(此处index
除外),传递给read(..)
:
def get(index, **kwargs):
elements = read(**kwargs)
答案 2 :(得分:0)
我想你可以在这里使用** kwargs。
** kwargs允许您将keyworded变量长度的参数传递给函数。如果要在函数中处理命名参数,则应使用** kwargs。这是一个例子:
def greet_me(**kwargs):
if kwargs is not None:
for key, value in kwargs.iteritems():
print "%s == %s" %(key,value)
输出:
greet_me(名称= “yasoob”) name == yasoob