2017-06-16 181 views
0

我想了解函数的参数实现,我想在示例中提出一个问题。Python 3中的函数声明参数

def learningFunction(*entry,fileName=None): 

    if fileName is not None: 

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

    else: 

     pass 

我想要做的是以下;

  • 当将有文件名作为一个参数的输入,功能不应该使用输入参数(例如:learningFunction(fileName="sample.txt")
  • 此外,可以存在仅仅条目变量作为输入(例如:learningFunction("stackoverflow")

它应该适用于这两个例子,但不是在同一时间,例如; (learningFunction("stackoverflow",fileName="sample.txt")

+0

我猜你的意思是功能,而不是方法,在你的例子。尽管如此,你是否可以澄清以下内容*“另外,可以将输入变量作为输入”*。 –

+0

你是对的,它应该是一个**功能**而不是一种方法,我想我会多澄清一点。 –

+0

现在,它实际上起作用。 @SergeBallesta –

回答

0

就个人而言,我会使用命名参数的条目和文件名。 那么你的代码看起来是这样的

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: 

在这里,您可以使用断言,以确保只是一个单一的参数了。

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

你想要什么是不可能的。你不能有两个参数(一个抢占了所有positionals)定义的函数,然后再用它不适合的情况下,您可以指定这些工作,那就是:

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

将是正确的。

可以加逻辑里面功能体当然是禁止这个。你不能让Python在调用时抛出一个错误,因为这是完全合法的。

无论您定义的参数是什么组合,您都无法获得此功能,如果您需要两个参数作为函数,那么传递两个参数的情况总是可以接受的。

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")