2 回答

TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個贊
這是一個設(shè)計問題。目前,validate的“合同”的一部分是它將調(diào)用一個custom_validation參數(shù)為零的方法。您需要更改validate以接受要傳遞的其他參數(shù):
def validate(self, *args, **kwargs):
self.custom_validation(*args, **kwargs)
或者您需要將標(biāo)志“嵌入”到對象本身中,以便custom_validation在調(diào)用時可以訪問它。
def validate(self):
self.custom_validation()
def custom_validation(self):
if self.allow_deferred_fields:
...
...
obj.allow_deferred_fields = True
obj.validate()
不過,第二個選項(xiàng)有點(diǎn)麻煩。這并不比有一個全局變量來custom_validation檢查好多少。
第三個選項(xiàng)是強(qiáng)制所有自定義驗(yàn)證方法在被 調(diào)用時接受(可能是任意的)關(guān)鍵字參數(shù)validate,盡管它們可以自由地忽略該參數(shù)。

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個贊
在這種情況下,很難檢查函數(shù)是否接受參數(shù)(請參閱 inspect.signature),但調(diào)用函數(shù)并在函數(shù)不支持參數(shù)時捕獲錯誤非常容易,前提是您知道函數(shù)將永遠(yuǎn)不要引發(fā) TypeError。
這樣做的好處是還可以使用基于 C 的函數(shù)。
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
try:
self.custom_validation(allow_deferred_fields=True)
except TypeError:
self.custom_validation()
如果你不能依賴函數(shù)永遠(yuǎn)不會拋出 TypeError,你可以嘗試以下方法,但請記住,如果函數(shù)是用 C 實(shí)現(xiàn)的,它將失敗
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
if "allow_deferred_fields" in inspect.signature(self.custom_validation):
self.custom_validation(allow_deferred_fields=True)
else:
self.custom_validation()
添加回答
舉報