【问题标题】:Declaring parameters on function in Python 3在 Python 3 中声明函数的参数
【发布时间】:2017-06-16 11:42:18
【问题描述】:

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

def learningFunction(*entry,fileName=None):

    if fileName is not None:

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

    else:

        pass

我正在尝试做的是以下;

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

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

【问题讨论】:

  • 我猜你的意思是功能,而不是方法,在你的例子中。尽管如此,您能否澄清以下内容“此外,也可以只使用条目变量作为输入”
  • 你说得对,它应该是一个函数而不是一个方法,我想我再澄清一点。
  • 目前,它确实有效。 @SergeBallesta

标签: python python-3.x function parameters


【解决方案1】:

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

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:
    ....

【讨论】:

    【解决方案2】:

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

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

    会是正确的。

    当然,您可以在函数体中添加逻辑来禁止这种情况。你不能让 Python 在调用它时抛出错误,因为这是完全合法的。

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

    【讨论】:

      【解决方案3】:

      当您使用 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"),你会得到一个异常

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多