具有不同标准给定参数的函数

时间:2017-05-22 10:21:12

标签: python python-3.x function arguments shortcut

首先提一下,我的代码有效,我只是觉得,我可以做得更高效。但是如何?

我有一个例程(可选和标准给定)参数:

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:这是我的第一个问题,如果我错过了规则,请纠正我。我正在学习。

3 个答案:

答案 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