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

Python 具有不同标准给定参数的函数,python,python-3.x,function,arguments,shortcut,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()

首先要提到的是,我的代码可以工作,我只是觉得,我可以做得更有效。但是怎么做呢

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

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

您可以使用字典并使用关键字参数:

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)
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})
或者,如果您只是想过滤掉所有参数的
None
s:

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)
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, path = None, name = None):
    kwargs = {}
    if path is not None:
        kwargs['path'] = path
    if name is not None:
        kwargs['name'] = name
    elements = read(**kwargs)
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})
或者,如果您只是想过滤掉所有参数的
None
s:

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)
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(…)


我想你可以在这里用**kwargs

**kwargs允许您将参数的关键字可变长度传递给函数。如果要处理函数中的命名参数,则应使用**kwargs。以下是一个例子:

def greet_me(**kwargs):
    if kwargs is not None:
        for key, value in kwargs.iteritems():
            print "%s == %s" %(key,value)
输出:

问候我(name=“yasoob”) name==yasoob


我想你可以在这里用**kwargs

**kwargs允许您将参数的关键字可变长度传递给函数。如果要处理函数中的命名参数,则应使用**kwargs。以下是一个例子:

def greet_me(**kwargs):
    if kwargs is not None:
        for key, value in kwargs.iteritems():
            print "%s == %s" %(key,value)
输出:

问候我(name=“yasoob”) name==yasoob


您可以修改
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

当然,您可以在
read
的定义中提供实际的默认值,而不是
path=None、name=None

您可以修改
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

当然,您可以在
read
的定义中提供实际的默认值,而不是
path=None、name=None(除非它们是可变的)。

谢谢。这是一个很好的解决方法!我喜欢这些例子。帮了大忙,谢谢。这是一个很好的解决方法!我喜欢这些例子。我帮了很多忙。谢谢,现在我知道**kwargs是如何以及为什么有用了!谢谢,现在我明白了**kwargs的用途和原因了!