![]() |
1
712
|
![]() |
2
519
鸭子打字
类型检查使用 Abstract Base Classes . 它们至少需要python 2.6,并且只适用于新样式的类。
然而,
|
![]() |
3
79
我想多了解一下
我将先列出事实,然后再跟进,快速提醒您在使用
事实
|
![]() |
4
30
这不够:返回的对象
在Python中,一个好的实践是“尝试查看”而不是“检查”。 |
![]() |
5
20
不运行检查以查看
|
![]() |
6
18
在python<=2.5中,您不能也不应该——iterable是一个“非正式”接口。 但是,由于python 2.6和3.0,您可以利用新的ABC(抽象基类)基础设施以及一些内置的ABC,这些ABC在collections模块中可用:
现在,无论这是可取的还是实际可行的,都只是惯例问题。如你所见,你 可以 将一个不可iterable对象注册为可iterable,它将在运行时引发异常。因此,isinstance获得了一个“新”的含义——它只是检查“声明的”类型兼容性,这是进入Python的一个好方法。 另一方面,如果您的对象不满足您需要的接口,您将要做什么?举个例子:
如果对象不满足您的期望,您只会抛出一个类型错误,但是如果注册了正确的ABC,您的检查将无效。相反,如果
所以,如果您只是期望一个iterable,那么就重复它,然后忘记它。另一方面,如果您需要根据输入类型做不同的事情,您可能会发现ABC基础结构非常有用。 |
![]() |
7
17
迄今为止我找到的最佳解决方案是:
它基本上检查对象是否实现
优势 (其他解决方案都没有这三个):
笔记:
|
![]() |
8
13
我找到了一个很好的解决办法 here :
|
![]() |
9
12
你可以试试这个:
如果我们可以生成一个迭代它的生成器(但不要使用生成器,这样它就不会占用空间),那么它是不可迭代的。好像是“该死”的东西。为什么您首先需要确定一个变量是否是可重复的? |
![]() |
10
10
根据 Python 2 Glossary 迭代是
当然,考虑到python的一般编码风格,基于这样一个事实:请求宽恕比请求许可容易。
但是如果您需要显式地检查它,您可以通过
|
![]() |
11
5
在我的脚本中,我经常发现定义
因此,您可以测试任何对象是否以非常可读的形式是可重写的。
就像你对待
编辑:如果安装了numpy,则只需执行以下操作:从
如果您没有numpy,可以简单地实现此代码或上面的代码。 |
![]() |
13
5
自从 Python 3.5 你可以使用 typing 标准库中与类型相关的内容的模块:
|
![]() |
14
3
这将对所有无法识别的对象说“是”,但它将 对python 2中的字符串说“否” . (这就是我想要的,例如,当一个递归函数可以接受一个字符串或一个字符串容器时。在那种情况下, asking forgiveness 可能导致代码模糊,最好先申请许可。)
这里的许多其他策略会对字符串说“是”。如果你想用的话就用它们。
注意:Is iterable()将对类型的字符串说Yes
门诊部
|
![]() |
15
2
最简单的方法,尊重巨蟒的 duck typing ,即捕获错误(python完全知道它期望从对象变成迭代器的内容):
笔记 :
|
![]() |
16
2
这个
例子
|
![]() |
17
1
而不是检查
由于明显的原因,没有一个iterable对象不会实现这一点。但是,它不捕获不实现它的用户定义的iterables,也不捕获生成器表达式,后者
(这有助于检查您是否可以打电话
|
![]() |
18
1
我一直不明白为什么蟒蛇
因为几乎所有其他答案都建议使用
为了python 2的缘故,我将使用lambda来提高性能…
请注意,对于具有
大多数无法识别的对象应该依赖
|
![]() |
19
0
不完全是 “正确” 但可以快速检查最常见的类型,如字符串、元组、浮点数等。
|
![]() |
20
-2
除了常规的尝试和例外,你可以运行帮助。
帮助将提供可以在该对象上运行的所有方法(它可以是任何对象,也可能不是示例中的列表),在本例中是temp。 注意:这将是您手动执行的操作。 |