我正在尝试理解函数的参数实现,我想在一个例子中提出一个问题。
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)
就个人而言,我会对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")