Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅当函数接受某个参数时才将该参数传递给该函数_Python_Parameter Passing - Fatal编程技术网

Python 仅当函数接受某个参数时才将该参数传递给该函数

Python 仅当函数接受某个参数时才将该参数传递给该函数,python,parameter-passing,Python,Parameter Passing,我有一个“验证”方法,其工作原理如下: def validate(self, allow_deferred_fields=False): """ Validate the data in the group. Raises ValidationError if there is any incorrect data. """ # Check custom validation of current group self.custom_validat

我有一个“验证”方法,其工作原理如下:

def validate(self, allow_deferred_fields=False):
    """
    Validate the data in the group.
    Raises ValidationError if there is any incorrect data.
    """
    # Check custom validation of current group
    self.custom_validation()
而且,自定义的_验证方法因要验证的组而异。我的一个自定义\u验证定义希望传递参数“允许\u延迟\u字段”,如下所示:

def custom_validation(self, allow_deferred_fields=False):
    if allow_deferred_fields:
    .... some code

但其他自定义的_验证方法不接受此参数。如何将此参数传递到validate方法内的自定义\u验证调用中,而不必将其作为参数添加到它可能调用的所有其他自定义\u验证方法中?

这是一个设计问题。目前,
validate
的“契约”的一部分是它将调用一个带有零参数的方法
custom\u validation
。您需要更改
validate
以接受要传递的其他参数:

def validate(self, *args, **kwargs):
    self.custom_validation(*args, **kwargs)
或者,您需要将标志“嵌入”到对象本身中,以便
custom\u validation
可以在调用时访问它

def validate(self):
    self.custom_validation()

def custom_validation(self):
    if self.allow_deferred_fields:
        ...

...
obj.allow_deferred_fields = True
obj.validate()
不过,第二种选择有点老套。这并不比使用一个全局变量进行
custom\u验证
检查好多少


第三个选项是强制所有自定义验证方法在被
validate
调用时接受(可能是任意的)关键字参数,尽管它们可以随意忽略参数。

在这种情况下,很难检查函数是否接受参数(请参阅inspect.signature)但是,如果函数不支持参数,调用该函数并捕获错误是非常容易的,只要您知道该函数永远不会引发TypeError

这也具有使用基于C的函数的优点

def验证(self,allow_deferred_fields=False):
"""
验证组中的数据。
如果存在任何不正确的数据,则引发ValidationError。
"""
#检查当前组的自定义验证
尝试:
self.custom\u验证(允许\u延迟\u字段=True)
除类型错误外:
self.custom_验证()
如果您不能依赖函数从不抛出TypeError,您可以尝试以下方法,但请记住,如果函数是用C实现的,那么它将失败

def验证(self,allow_deferred_fields=False):
"""
验证组中的数据。
如果存在任何不正确的数据,则引发ValidationError。
"""
#检查当前组的自定义验证
如果在inspect.signature(self.custom\u验证)中出现“allow\u deferred\u fields”:
self.custom\u验证(允许\u延迟\u字段=True)
其他:
self.custom_验证()

对不起,我不明白您想说什么,您能添加其他自定义\u验证器的定义吗?您是否经历过
**kwargs、*args
?你知道python中的方法重载吗?