python:验证函数参数

python:验证函数参数,python,coding-style,python-3.x,Python,Coding Style,Python 3.x,我需要确保所有的命名参数都被传递给一个方法(我不想要任何默认值)。以下是执行它的最佳方式吗 class X: def func(self, **kwargs): if set(kwargs.keys() != ('arg1', 'arg2', 'arg3'): raise ArgException(kwargs) 尽管你可以让口译员来处理: class X(object): def func(self, arg1, arg2, arg3): pa

我需要确保所有的命名参数都被传递给一个方法(我不想要任何默认值)。以下是执行它的最佳方式吗

class X:
  def func(self, **kwargs):
    if set(kwargs.keys() != ('arg1', 'arg2', 'arg3'):
      raise ArgException(kwargs)
尽管你可以让口译员来处理:

class X(object):
    def func(self, arg1, arg2, arg3):
        pass

对于Python2.x,Hugh的答案(即只使用命名的位置参数)是最好的选择

对于Python 3.x,您还可以选择要求使用关键字参数(而不仅仅是允许使用),如下所示:

class X(object):
    def func(self, *, arg1, arg2, arg3):
        pass

是否允许其他参数?如果没有:

class X(object):
    def func(self, arg1, arg2, arg3):
        pass
如果是:

class X(object):
    def func(self, arg1, arg2, arg3, **kwargs):
        pass

这适用于所有版本的Python

确保您引发的异常是TypeError的子类。如果你想这样做,为什么要使用kwargs呢?只需要正常地指定变量,糟糕的设计。使用
def func(self,arg1,arg2,arg3)
@S Lott我会按照你的建议使用,但是我会在参数的顺序上不断出错@Glenn Maynard我使用命名参数只是为了避免顺序错误(我的许多函数中有3-6个参数)。不好?天哪,我不知道即使函数定义为
def func(self,a,b,c)
,我也可以使用关键字参数+1.是的,请看我对问题的评论。我不知道我怎么会不知道。。
class X(object):
    def func(self, arg1, arg2, arg3, **kwargs):
        pass