我正在开发一个Python应用程序,我需要多次检查一个对象是否是DB模型的子类。如果第一个参数不是类,issubclass会引发异常
我做了我自己的函数来做到这一点:
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)
但为什么内置issubclass
没有这样做?什么原因?我错过了什么吗?
UPDATE:
我有型号:
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是很正常的,而不是if something is not None or len(something) != 0
使用if something
而不是任何TypeError
。如果issubclass
的第一个参数不是类,那么引发TypeError有什么用处?
例如,有人问一只狗:'你是否是正确的人来解决这个任务?',而不是回答'不',狗说'我不是男人'。我问某人一件事(是子类),他没有回答我的问题。
引发'TypeError'对我来说似乎是一件非常自然的事......它鼓励正确地做事。你试图给'issubclass'坏数据;就像'float('foo')'会引发一个ValueError而不是像在某些语言中那样返回'float'('nan')',这只是Python的做事方式。如果你使用的是静态类型的语言,它通常会在编译时窒息。 – 2012-01-01 09:32:47