python – 如果第一个参数不是类,则issubclass引发异常
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 如果第一个参数不是类,则issubclass引发异常,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2064字,纯文字阅读大概需要3分钟。
内容图文
![python – 如果第一个参数不是类,则issubclass引发异常](/upload/InfoBanner/zyjiaocheng/776/d598c42c429f4b6d8496378bf343c74e.jpg)
我正在开发一个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')
在那里进行断言只是意味着你隐藏了传递错误信息的类型错误这一事实.
内容总结
以上是互联网集市为您收集整理的python – 如果第一个参数不是类,则issubclass引发异常全部内容,希望文章能够帮你解决python – 如果第一个参数不是类,则issubclass引发异常所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。