我尝试了一些明显的选项,但没有一个可行:
In [150]: x
Out[150]: datetime.date(2012, 9, 1)
In [151]: type(x)
Out[151]: datetime.date
In [152]: isinstance(x, datetime.date)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-152-9a298ea6fce5> in <module>()
----> 1 isinstance(x, datetime.date)
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
In [153]: x is datetime.date
Out[153]: False
In [154]: type(x) is datetime.date
Out[154]: False
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?
似乎2 is 2并且3 is 3在python中总是如此,并且通常,对整数的任何引用都与对同一整数的任何其他引用相同.同样的情况,以None(即None is None).我知道,这并没有发生在用户定义的类型或可变类型.但它有时也会在不可变类型上失败:
>>> () is ()
True
>>> (2,) is (2,)
False
Run Code Online (Sandbox Code Playgroud)
也就是说:空元组的两个独立构造产生对内存中相同对象的引用,但是相同的一个(不可变)元素元组的两个独立构造最终创建两个相同的对象.我测试了,并且frozenset以类似于元组的方式工作.
是什么决定了一个对象是在内存中复制还是会有一个包含大量引用的实例?它取决于对象在某种意义上是否是"原子"的?它是否因实施而异?
我今天开始学习Python,我想出了创建一个程序,打印从0到10 000的所有素数的想法.我设法让我的程序打印出所有质数,直到251,此时它停止打印出数字.为什么这样做?
这是代码:
for numberToCheck in range(2,10000):
divider = 2
while numberToCheck > divider:
if numberToCheck % divider is 0:
break
else:
divider += 1
if numberToCheck is divider:
print(numberToCheck, "is a prime number.")
Run Code Online (Sandbox Code Playgroud) 存在用于Python的静态分析工具,但编译时间检查往往与Python所包含的运行时绑定哲学截然相反.这可能与一个静态分析工具来执行一些"包装标准Python解释器使用严格 "般的约束,但我们没有看到任何广泛采用的这样的事情.
有没有关于Python的东西会使"使用严格"的行为变得不必要或特别不受欢迎?
或者,Perl中的"使用严格"行为是否已被广泛采用?
注意:"必要"是指"实际必要",并非绝对必要.显然你可以在没有"use strict"的情况下编写Perl,但是(从我所见过的)大多数Perl程序员都会使用它.
注意:Python解释器包装器不需要 "使用严格"类似的约束 - 您可以使用类似于"use strict"的伪编译指示,这将被普通解释器忽略.我不是在谈论添加语言级功能.
更新:解释Perl每条评论中"use strict"的作用.(官方文档链接在第一段.)
"use strict"指令有三个不同的组件,其中只有两个非常有趣:
use strict vars:在程序中静态检查词法范围的变量用法.(请记住,在Python中,基本上只有global范围和local范围).许多Python短信检查这种事情.因为它是他们可以做的唯一的静态分析,所以直言不讳地假设你使用简单的词汇范围,并在你告诉他们闭嘴之前警告你那些看似错误的东西; 即
FOO = 12
foo += 3
Run Code Online (Sandbox Code Playgroud)
如果您没有对命名空间做任何想法,那么检查拼写错误就很有用.
use strict refs:防止符号命名空间解除引用.Python最接近的模拟是使用locals()和globals()进行符号绑定和标识符查找.
use strict subs:在Python中没有真正的模拟.
python compiler-construction perl static-analysis use-strict
是否优先做:
if x is y:
return True
Run Code Online (Sandbox Code Playgroud)
要么
if x == y
return True
Run Code Online (Sandbox Code Playgroud)
同样的事情是"不是"
我的应用程序将PDF打印到临时文件.如何使用Python中的默认应用程序打开该文件?
我需要一个解决方案
进入以下几点:
>>> class A:
... def __str__(self):
... return "some A()"
...
>>> class B(A):
... def __str__(self):
... return "some B()"
...
>>> print A()
some A()
>>> print B()
some B()
>>> A.__str__ == B.__str__
False # seems reasonable, since each method is an object
>>> id(A.__str__)==id(B.__str__)
True # what?!
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
自从我开始学习python以来已经过了几天,此时我偶然发现了==它is.来自java背景我假设==通过对象id和is值进行比较,但是这样做
>>> a = (1,2)
>>> b = (1,2)
>>> a is b
False
>>> a == b
True
Run Code Online (Sandbox Code Playgroud)
好像is相当于java ==和python ==相当于java的equals().这是考虑is和之间区别的正确方法==吗?或者有一个警告?
Variable = None
Run Code Online (Sandbox Code Playgroud)
在特定情况下这三者之间有什么区别吗?如果哪一个更适合使用没有区别?
if Variable:
print "Hello world"
Run Code Online (Sandbox Code Playgroud)
和
if Variable is not None:
print "Hello world"
Run Code Online (Sandbox Code Playgroud)
和
if Variable != None:
print "Hello world"
Run Code Online (Sandbox Code Playgroud)
无变量的情况是一样的吗?
考虑以下代码:
class Person(object):
def sayHello(self):
return 'Hello'
print(Person().sayHello is Person().sayHello)
Run Code Online (Sandbox Code Playgroud)
我希望它能显示出真实.为什么显示False?
python ×10
object ×3
comparison ×2
python-3.x ×2
class ×1
datetime ×1
identity ×1
linux ×1
methods ×1
oop ×1
overriding ×1
perl ×1
reference ×1
use-strict ×1
windows ×1