新typing模块包含几个名称为"SupportsInt"(-Float,-Bytes等)的对象.可能会读取该模块的名称和文档页面上的说明,以表明您可以测试对象是否属于"支持__int__()" 类型.但是如果你尝试使用isinstance()它,它会给出一个响应,表明这不是你想要做的事情:
>>> isinstance(5, typing.SupportsInt)
(Traceback omitted)
TypeError: Protocols cannot be used with isinstance().
Run Code Online (Sandbox Code Playgroud)
另一方面,您可以使用issubclass():
>>> issubclass((5).__class__, typing.SupportsInt)
True
>>> issubclass(type(5), typing.SupportsInt)
True
Run Code Online (Sandbox Code Playgroud)
在这种情况下,什么是"协议"?为什么不允许isinstance()以这种方式使用?
如何检查对象是否是字符串列表?我只能检查一个对象是否是字符串:
def checktype(obj):
if isinstance(obj,str):
print "It's a string"
obj1 = ['foo','bar','bar','black','sheet']
obj2 = [1,2,3,4,5,'bar']
obj3 = 'bar'
for i in [obj1,obj2,obj3]:
checktype(i)
Run Code Online (Sandbox Code Playgroud)
期望的输出:
It's a list of strings
It's not a list of strings or a single string
It's a single string
Run Code Online (Sandbox Code Playgroud) 我们有一个函数,它接受各种不同类型的输入:函数,字符串,编译的正则表达式,Hamcrest匹配器,并根据输入的类型适当地过滤列表.
我们目前正在使用isinstance(our_filter, hamcrest.matcher.Matcher),但这需要我们安装Hamcrest.
我们正在考虑使用字符串匹配inspect.getmro(type(POSSIBLE_MATCHER)); 但这感觉不洁净.import语句可能还有try/ except周围的选项.
什么是最好的方法?
在@dblslash的帮助下,这是迄今为止我所做的最好的:
[x.__module__+"."+x.__name__ for x in inspect.getmro(type(POSSIBLE_MATCHER))]
['hamcrest.core.core.isequal.IsEqual', 'hamcrest.core.base_matcher.BaseMatcher', 'hamcrest.core.matcher.Matcher', 'hamcrest.core.selfdescribing.SelfDescribing', '__builtin__.object']
我想了解Python的类型注释如何工作(如List和Dict- 不list或dict).具体来说,我对如何isinstance(list(), List)工作感兴趣,以便我可以创建自己的自定义注释.
我看到它List被定义为:
class List(list, MutableSequence[T], extra=list):
. . .
Run Code Online (Sandbox Code Playgroud)
我很熟悉,metaclass = xxx但我找不到任何关于此的文档extra = xxx.这是一个关键字还是一个参数,如果是这样的话,它来自哪里,它会做我想要的事情?它甚至相关isinstance吗?
我尝试检查一个变量是一个数字的任何类型(的一个实例int,float,Fraction,Decimal,等等).
我提出了这个问题及其答案:如何正确使用python的isinstance()来检查变量是否为数字?
但是,我想排除复杂的数字,如1j.
该类numbers.Real看起来完美,但它返回False的Decimal数字...
from numbers Real
from decimal import Decimal
print(isinstance(Decimal(1), Real))
# False
Run Code Online (Sandbox Code Playgroud)
相反,它可以正常工作Fraction(1).
该文档描述了一些应该与数字一起使用的操作,我在十进制实例上没有任何错误地测试它们.此外,十进制对象不能包含复数.
那么,为什么isinstance(Decimal(1), Real)会回来False呢?
在以下代码段中:
In [1]: x = [0]
In [2]: isinstance(x, list)
Out[2]: True
In [3]: isinstance(x, (list, set))
Out[3]: True
In [4]: isinstance(x, [list, set])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-95dd12d6777a> in <module>()
----> 1 isinstance(x, [list, set])
TypeError: isinstance() arg 2 must be a type or tuple of types
Run Code Online (Sandbox Code Playgroud)
为什么isinstance在[4]坚持第二个参数是一个元组,而不仅仅是一个迭代(例如,一个list或一个set)?看起来像一个奇怪的设计决定.
和typing都collections.abc包括类似的类型,例如Mapping、Sequence等。
根据 python 文档,似乎collections.abc首选类型检查:
该模块提供了抽象基类,可以用来测试一个类是否提供了特定的接口;例如,它是否可散列或是否是映射。 https://docs.python.org/3/library/collections.abc.html
但使用typing也有效,我宁愿不Mapping从typing和导入collections.abc。typing那么使用with有什么问题吗isinstance()?
在Python 2中,为什么旧样式类的实例仍然是实例,object即使它们没有显式继承object?
class OldClass:
pass
>>> isinstance(OldClass(), object)
True
Run Code Online (Sandbox Code Playgroud)
在测试之前,我会得出结论,isinstance(x, object) == True这意味着它x是一个子类object的实例,因此是新样式类的一个实例,但似乎Python 2中的所有对象都是实例object(是的,我知道声音有多明显) ).
进一步挖掘,我发现了一些看似奇怪的行为:
>>> issubclass(OldClass, object)
False
Run Code Online (Sandbox Code Playgroud)
我的印象isinstance(x, SomeClass)实际上相当于issubclass(x.__class__, SomeClass),但显然我错过了一些东西.
在Python文档的except说:
对于带有表达式的except子句,将计算该表达式,如果结果对象与异常"兼容",则子句匹配该异常.如果对象是异常对象的类或基类,则该对象与异常兼容,[...]
为什么不except使用isinstance而不是比较基类?这样可以防止使用__instancecheck__覆盖实例检查.
编辑:
我可以理解,这不存在的原因之一是没有人考虑过它.但有什么理由不应该实施吗?
编辑:
Python 3.2a中的Shell会话显示尝试使用__subclasscheck__此方法不起作用:
>>> class MyType(type): __subclasscheck__ = lambda cls, other_cls: True
>>> class O(Exception, metaclass=MyType): pass
>>> issubclass(3, O)
0: True
>>> issubclass(int, O)
1: True
>>> try:
... 1/0
... except O:
... print('Success')
Traceback (most recent call last):
File "<pyshell#4>", line 2, in <module>
1/0
ZeroDivisionError: division by zero
>>>
Run Code Online (Sandbox Code Playgroud) 在我写这篇文章的时候,对我来说,我实际上遇到了这个问题.
我有一个对象列表.这些对象中的每一个都是Individual我编写的类的实例.
因此,传统智慧说isinstance(myObj, Individual)应该回归True.但事实并非如此.所以我认为我的编程中存在一个错误并打印出来type(myObj),令我惊讶的是打印instance并myObj.__class__给了我Individual!
>>> type(pop[0])
<type 'instance'>
>>> isinstance(pop[0], Individual) # with all the proper imports
False
>>> pop[0].__class__
Genetic.individual.Individual
Run Code Online (Sandbox Code Playgroud)
我很难过!是什么赋予了?
编辑:我的个人课程
class Individual:
ID = count()
def __init__(self, chromosomes):
self.chromosomes = chromosomes[:] # managed as a list as order is used to identify chromosomal functions (i.e. chromosome i encodes functionality f)
self.id = self.ID.next()
# other methods
Run Code Online (Sandbox Code Playgroud) isinstance ×10
python ×10
class ×3
python-3.x ×2
types ×2
decimal ×1
exception ×1
hamcrest ×1
inspect ×1
metaclass ×1
numbers ×1
python-2.x ×1
type-hinting ×1