在Python 3中声明函数的参数

时间:2017-06-16 11:42:19

标签: python python-3.x function parameters

我正在尝试理解函数的参数实现,我想在一个例子中提出一个问题。

def learningFunction(*entry,fileName=None):

    if fileName is not None:

        entry = open(fileName,'r').read() 

    else:

        pass

我想做的是以下几点;

  • 当fileName作为参数的输入时,函数不应使用entry参数(例如:learningFunction(fileName="sample.txt")
  • 此外,可以只将输入变量作为输入(例如:learningFunction("stackoverflow")

它应该适用于这两个例子,但不能同时使用; (learningFunction("stackoverflow",fileName="sample.txt")

3 个答案:

答案 0 :(得分:0)

就个人而言,我会对entry和filename使用命名参数。 然后你的代码看起来像这样

def learningFunction(entry=None, filename=None):
    assert not entry!= None and filename!= None, "only one param please"
    ...

但您也可以使用自己的设置。 *entry将接受任意数量的参数并将它们存储为元组。 空元组的计算结果为False。

你可以使用这样的代码:

def learningFunction(*entry, filename=None):
    if entry:
        ...
    else:

在这里你可以使用asserts来确保只有一个参数。

if entry:
    assert filename == None, "just one param please"
else:
    ....

答案 1 :(得分:0)

你想要的是不可能的。你不能有一个用两个参数定义的函数(一个抓住所有的位置),然后让它不适用于你指定这些的情况,即:

learningFunction("stackoverflow",fileName="sample.txt")

是正确的。

当然, 可以函数体内添加逻辑以禁止此操作。你不能让Python在调用时抛出错误,因为这是完全合法的。

无论你定义什么参数组合,你都无法得到它,如果你的函数需要两个参数,那么传递两个参数的情况总是可以接受的。

答案 2 :(得分:0)

在使用Python3时,您可以使用inspect模块在​​注释函数中外部化参数验证。例如,这个将确保只填充被调用函数的一个参数:

def singleparam(func):
    sig = inspect.signature(func)
    def wrapper(*args, **kwargs):
        # controls that only one parameter has been populated
        if len(sig.bind(*args, **kwargs).arguments) != 1:
            raise TypeError("Both positional and keyword parameters")
        return func(*args, **kwargs) # call original function
    wrapper.__signature__ = sig      # keeps original signature
    return wrapper

你可以定义你的功能:

@singleparam
def learningFunction(*entry,fileName=None):
    ...

如果您将其称为learningFunction("stackoverflow",fileName="sample.txt")

,则会收到例外情况