gpt4 book ai didi

python - 如果第一个参数不是类,则 issubclass 引发异常

转载 作者:太空宇宙 更新时间:2023-11-03 11:34:23 30 4
gpt4 key购买 nike

我正在开发一个 Python 应用程序,我需要多次检查对象是否是数据库模型的子类。

我做了我自己的功能来做到这一点:

def isModel(obj):
return isinstance(obj, type) and issubclass(obj, Model)

issubclass 引发 obj 不是一个类的异常,但我希望它在 obj 不是一个类时返回 False。

我认为最好创建另一个函数,而不是使用内置的 issubclass:

def _issubclass(obj, Klass):
return isinstance(obj, type) and issubclass(obj, Klass)

但是为什么内置的issubclass不是那样做的呢?什么原因?我错过了什么吗?


更新:

我有模型:

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 而不是引发任何 TypeError。如果 issubclass 的第一个参数不是类,引发 TypeError 有什么用?

例如有人问狗:“你是解决这个任务的合适人选吗?”,狗没有回答“不”,而是说“我不是人”。我问某人一件事(是子类),他没有回答我的问题。

最佳答案

我发现了一种使用元类的更优雅的方式(因为我的模型无论如何都在使用它们):

Python 2.7.2+ (default, Oct  4 2011, 20:06:09) 
[GCC 4.6.1] on linux2

>>> class ModelMeta(type):
... "Metaclass for models"
...
>>> class Model(object):
... "DB model"
... __metaclass__ = ModelMeta
...
>>> class MyModel(Model):
... "A real model"
...
>>> isinstance(MyModel, type) and issubclass(MyModel, Model)
True
>>> myModelInstance = Model()
>>> issubclass(MyModel, Model)
True
>>> issubclass(myModelInstance, Model)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: issubclass() arg 1 must be a class
>>> isinstance(MyModel, type) and issubclass(MyModel, Model)
True
>>> isinstance(myModelInstance, type) and issubclass(myModelInstance, Model)
False
>>> isinstance(MyModel, ModelMeta)
True
>>> isinstance(myModelInstance, ModelMeta)
False
>>>

所以,isinstance(MyModel, ModelMeta) 是我现在使用的。

关于python - 如果第一个参数不是类,则 issubclass 引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8692430/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com