标签: isinstance

"协议不能与isinstance()一起使用" - 为什么不呢?

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()以这种方式使用?

python isinstance python-3.x

14
推荐指数
2
解决办法
494
查看次数

Python:检查对象是否是字符串列表

如何检查对象是否是字符串列表?我只能检查一个对象是否是字符串:

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)

python types isinstance

13
推荐指数
2
解决办法
1万
查看次数

isinstance没有导入候选人

我们有一个函数,它接受各种不同类型的输入:函数,字符串,编译的正则表达式,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 class hamcrest inspect isinstance

12
推荐指数
2
解决办法
1646
查看次数

如何为List工作?

我想了解Python的类型注释如何工作(如ListDict- listdict).具体来说,我对如何isinstance(list(), List)工作感兴趣,以便我可以创建自己的自定义注释.

我看到它List被定义为:

class List(list, MutableSequence[T], extra=list):
    . . .
Run Code Online (Sandbox Code Playgroud)

我很熟悉,metaclass = xxx但我找不到任何关于此的文档extra = xxx.这是一个关键字还是一个参数,如果是这样的话,它来自哪里,它会做我想要的事情?它甚至相关isinstance吗?

python metaclass type-hinting isinstance python-3.x

11
推荐指数
1
解决办法
1048
查看次数

为什么'decimal.Decimal(1)'不是'numbers.Real'的实例?

我尝试检查一个变量是一个数字的任何类型(的一个实例int,float,Fraction,Decimal,等等).

我提出了这个问题及其答案:如何正确使用python的isinstance()来检查变量是否为数字?

但是,我想排除复杂的数字,如1j.

该类numbers.Real看起来完美,但它返回FalseDecimal数字...

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呢?

python numbers decimal isinstance

11
推荐指数
1
解决办法
547
查看次数

为什么isinstance需要一个元组而不是任何可迭代元组?

在以下代码段中:

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)?看起来像一个奇怪的设计决定.

python isinstance

11
推荐指数
0
解决办法
101
查看次数

`isinstance()` 应该检查输入还是 collections.abc 吗?

typingcollections.abc包括类似的类型,例如MappingSequence等。

根据 python 文档,似乎collections.abc首选类型检查:

该模块提供了抽象基类,可以用来测试一个类是否提供了特定的接口;例如,它是否可散列或是否是映射。 https://docs.python.org/3/library/collections.abc.html

但使用typing也有效,我宁愿不Mappingtyping和导入collections.abctyping那么使用with有什么问题吗isinstance()

python isinstance

10
推荐指数
2
解决办法
2315
查看次数

为什么旧样式类的实例是`object`的实例?

在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 class python-2.x isinstance python-internals

9
推荐指数
0
解决办法
227
查看次数

为什么Python的`除了'使用`isinstance`?

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)

python types exception-handling exception isinstance

8
推荐指数
1
解决办法
1648
查看次数

正确使用`isinstance(obj,class)`

在我写这篇文章的时候,对我来说,我实际上遇到了这个问题.

我有一个对象列表.这些对象中的每一个都是Individual我编写的类的实例.

因此,传统智慧说isinstance(myObj, Individual)应该回归True.但事实并非如此.所以我认为我的编程中存在一个错误并打印出来type(myObj),令我惊讶的是打印instancemyObj.__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)

python class isinstance

8
推荐指数
1
解决办法
4908
查看次数