【问题标题】:python: is it possible to require that arguments to the functions are all keyword?python:是否可以要求函数的参数都是关键字?
【发布时间】:2011-10-02 05:53:19
【问题描述】:

为了避免明显的错误,我想防止在某些函数中使用位置参数。有什么方法可以实现吗?

【问题讨论】:

  • 为什么要这样做?我们都是成年人,对吧?
  • 答案其实很简单:不要。我知道,您可能会认为有一个很棒的用例可以出色地解决某些问题,但是相信我,您正在违背该语言的基本哲学——我们都是同意的成年人。走这样的路只会让人难过。
  • 这听起来像一个愚蠢的事情来强制。但是,如果您愿意,您可以养成在函数调用时按名称指定位置 arg 的习惯。这样,如果位置 arg 的名称发生更改,调用者将收到 TypeError(这是您要避免的那种明显的错误吗?)。
  • 强制执行并不是那么愚蠢。有些函数最好使用仅关键字参数:list.sort(reverse=True) 就是一个例子。这允许更高版本的 API 重新排列参数(如 Python 3 所做的那样)。如果参数顺序不是 API 的一部分,则使用位置参数的代码可能会在使用更高版本的相关库时中断。此类错误绝不应无声无息地过去。

标签: python function coding-style python-3.x


【解决方案1】:

只有 Python 3 才能正确完成(而且你使用了 python3 标签,所以没问题):

def function(*, x, y, z):
    print(x,y,z)

使用**kwargs 会让用户输入any 参数,除非您稍后检查。此外,它会隐藏真实的参数名称,不自省。

**kwargs 不是这个问题的答案。

测试程序:

>>> function(1,2,3)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    function(1,2,3)
TypeError: function() takes exactly 0 positional arguments (3 given)
>>> function(x=1, y=2, z=3)
1 2 3

【讨论】:

    【解决方案2】:

    您可以使用自省定义一个装饰器,如果它装饰的函数使用任何位置参数,则会导致错误。这允许您防止在某些函数中使用位置参数,同时允许您根据需要定义这些函数。

    举个例子:

    def kwargs_only(f):
        def new_f(**kwargs):
            return f(**kwargs)
        return new_f
    

    使用它:

    @kwargs_only
    def abc(a, b, c): return a + b + c
    

    因此你不能使用它(类型错误):

    abc(1,2,3)
    

    你可以这样使用它:

    abc(a=1,b=2,c=3)
    

    更强大的解决方案是使用decorator 模块。

    免责声明:不能保证深夜答案!

    【讨论】:

      【解决方案3】:

      是的,只需使用 **kwargs 构造并仅从那里读取您的参数。

      def my_function(**kwargs):
          for key, value in kwargs.iteritems():
              print ("%s = %s" % (key, value))
      
      my_function(a="test", b="string")
      

      【讨论】:

      • 嘿downvoters:能告诉我这怎么不满足OP的要求吗?确切的词:“防止使用位置参数”。没有指定其他内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 2015-10-16
      相关资源
      最近更新 更多