我正在开发一个
Python应用程序,我需要多次检查对象是否是数据库模型的子类.
我做了我自己的功能:
def isModel(obj):
return isinstance(obj, type) and issubclass(obj, Model)
issubclass引发异常obj不是一个类,但我希望它只是返回False,如果obj不是一个类.
我想更好地制作另一个函数,而不是使用内置的issubclass:
def _issubclass(obj, Klass):
return isinstance(obj, type) and issubclass(obj, Klass)
但为什么内置的子类不是那样的呢?什么原因?我错过了什么吗?
更新:
我有模特:
class BaseModel(object):
id = Field(...)
class MyModel(BaseModel):
deleted = Field(...)
在函数中,我想检查参数是否是BaseModel:
def update_model(model):
assert isinstance(model, type) and issubclass(model, BaseModel), 'Must be a model'
如果对象是给定类的子类,则issubclass回答问题.如果对象是一个类实例,那么答案IMO应该是’不,你的对象不是BaseModel的子类,因为它根本不是一个类’.
在Python中是非常正常的,而不是如果某些东西不是None或len(某事物)!= 0来使用,如果有什么东西而不引发任何TypeError.如果issubclass的第一个参数不是类,那么引发TypeError的用处是什么?
例如,有人问狗:“你是解决这个问题的合适人选吗?”,而不是回答’不’,狗说“我不是男人”.我问了一件事(是子类),他没有回答我的问题.
最佳答案 Isinstance可能会做你想要的.当obj是作为Klass子类的类的实例时,isinstance(obj,Klass)将返回True.
例:
>>> class A(object):
... pass
...
>>> class B(A):
... pass
...
>>> obj = B()
>>>
>>> isinstance(obj, A)
True
“如果issubclass的第一个参数不是类,那么引发TypeError有什么用?”
显式优于隐式.您将非类传递给了issubclass.这表明你做错了什么.因此,您会收到错误消息.如果您真的想将实例传递给issubclass,则可以捕获该错误:
try:
isbasemodel = False
if issubclass(x, BaseModel):
isbasemodel = True
except TypeError:
# Accept that we test non-classes:
pass
或者,当然,你可以做你做的事:额外检查.
但是,如果它没有引发错误,那么就不可能发现传入实例的错误.
根据我的理解,您想要检查API或类似的内容,传入的对象是BaseModel的子类,并且不应允许用户传入实例. IMO,正确的做法是在传递错误的东西时引发TypeError.像这样:
def update_model(model):
if not issubclass(model, BaseModel):
raise TypeError('Must be a model')
在那里进行断言只是意味着你隐藏了传递错误信息的类型错误这一事实.