为什么这不是天真的预期?
class Foo(object):
def __init__(self):
self.bar = 3
def __bool__(self):
return self.bar > 10
foo = Foo()
if foo:
print 'x'
else:
print 'y'
Run Code Online (Sandbox Code Playgroud)
(输出是x)
我最近开始研究如何在Python中实现各种数据结构,以使我的代码更高效.在调查列表和deques的工作原理时,我发现当我想要移位和卸载时,我可以获得好处,从列表中的O(n)减少到deques中的O(1)的时间(列表被实现为具有固定长度的数组,具有每次在前面插入某些东西时都要完全复制......).我似乎无法找到的是deque如何实现的具体细节,以及它的缺点与列表的细节.有人可以在这两个问题上启发我吗?
我很好奇__del__python中的细节,何时以及为什么应该使用它以及它不应该用于什么.我已经学到了很难的方法,它不像人们对析构函数的天真期望,因为它不是__new__/ 的反面__init__.
class Foo(object):
def __init__(self):
self.bar = None
def open(self):
if self.bar != 'open':
print 'opening the bar'
self.bar = 'open'
def close(self):
if self.bar != 'closed':
print 'closing the bar'
self.bar = 'close'
def __del__(self):
self.close()
if __name__ == '__main__':
foo = Foo()
foo.open()
del foo
import gc
gc.collect()
Run Code Online (Sandbox Code Playgroud)
我在文档中看到,不保证__del__()在解释器退出时仍然存在的对象调用方法.
Foo解释器退出时存在的任何实例都关闭了吧?del foo还是gc.collect()......或者两者都没有?如果你想更好地控制那些细节(例如,当对象未被引用时应该关闭条形图)实现它的常用方法是什么?__del__被调用时能够保证所有的__init__已经叫什么名字?如果__init__举起怎么样?python constructor garbage-collection destructor reference-counting
我可以在python中为其他dicts的dict comprehension扩展语法,比如collections模块中的OrderedDict 或继承自我自己的类型dict吗?
重新绑定dict名称显然不起作用,{key: value}理解语法仍然为您提供了一个简单的旧词典,用于理解和文字.
>>> from collections import OrderedDict
>>> olddict, dict = dict, OrderedDict
>>> {i: i*i for i in range(3)}.__class__
<type 'dict'>
Run Code Online (Sandbox Code Playgroud)
那么,如果可能的话我该怎么做呢?如果它只适用于CPython,那就没关系.对于语法,我想我会尝试使用O{k: v}像我们一样的前缀r'various' u'string' b'objects'.
注意: 当然我们可以使用生成器表达式,但我更感兴趣的是看到语法方面的hathon是多么糟糕.
python dictionary cpython ordereddictionary dictionary-comprehension
我对subprocess使用时如何搜索可执行文件感到困惑Popen().如果给定子进程的绝对路径,它可以工作,但我正在尝试使用相对路径.我发现如果我设置环境变量PYTHONPATH然后我可以从该路径获得导入的模块,并且PYTHONPATH存在sys.path,但它似乎没有帮助的行为subprocess.Popen.我也尝试过编辑sitecustomize.py添加PYTHONPATH 的文件os.environ,就像这样
# copy PYTHONPATH environment variable into PATH to allow our stuff to use
# relative paths for subprocess spawning
import os
if os.getenv('PYTHONPATH') is not None and os.getenv('PATH') is not none:
os.environ['PATH'] = ':'.join([os.getenv('PATH'), os.getenv('PYTHONPATH')])
Run Code Online (Sandbox Code Playgroud)
并且验证了在启动python时,无论是交互式地,使用ipython,还是通过从命令行运行脚本,PYTHONPATH都成功出现os.environ.但是,subrocess.Popen 仍然不在那里搜索可执行文件.如果没有env指定kwarg ,我认为它应该继承父母的环境?接下来我尝试env明确地给出,首先通过制作副本,os.getenv然后仅仅通过给予env={'PATH': '/explicit/path/to/search/from'},它仍然找不到可执行文件.现在我很难过.
希望一个例子可以帮助我更清楚地解释我的问题:
/ dir/subdir1/some_executable
/dir/subdir2/some_script.py
# some_script.py
from subprocess import Popen, PIPE
spam, eggs = Popen(['../subdir1/some_executable'], …Run Code Online (Sandbox Code Playgroud) 为什么set函数调用会消除欺骗,但解析集合文字却没有?
>>> x = Decimal('0')
>>> y = complex(0,0)
>>> set([0, x, y])
{0}
>>> {0, x, y}
{Decimal('0'), 0j}
Run Code Online (Sandbox Code Playgroud)
(Python 2.7.12.可能与此类似问题的根本原因相同)
我理解这一点没有问题:
a = [1,2,3,4]
b = [x for x in a]
Run Code Online (Sandbox Code Playgroud)
我以为就是这样,但后来我找到了这个片段:
a = [[1,2],[3,4],[5,6]]
b = [x for xs in a for x in xs]
Run Code Online (Sandbox Code Playgroud)
这使得b = [1,2,3,4,5,6].问题是我在理解语法方面遇到了麻烦[x for xs in a for x in xs],有人能解释一下它是如何工作的吗?
我想知道是否有任何方法可以注释掉部分行,就像你可以用c ++一样/*this*/.我所知道的唯一评论# this总是在线的末尾和"""these"""那些在中线不起作用的注释.
示例用例:使用子进程并需要临时注释掉-p 0列表中的参数:
['../some/guy', '-m', '10', '-p', '0', '-n', '100', '-f', '/dev/stdout']
Run Code Online (Sandbox Code Playgroud)
有一个键盘快捷键可以注释掉一个选项会很高兴,此刻我只是复制整行,如下所示
#['../some/guy', '-m', '10', '-p', '0', '-n', '100', '-f', '/dev/stdout']
['../some/guy', '-m', '10', '-n', '100', '-f', '/dev/stdout']
Run Code Online (Sandbox Code Playgroud)
我期待一个大胖子'不',但我想这不会有问题,python几次让我感到惊讶.
今天在我们的代码库中注意到一行,我认为肯定会因为语法错误而无法构建,但是测试正在通过,所以显然它实际上是有效的python(在2.x和3中).
条件表达式有时不需要空格:
>>> 1if True else 0
1
Run Code Online (Sandbox Code Playgroud)
如果LHS是变量,它不起作用:
>>> x = 1
>>> xif True else 0
File "<stdin>", line 1
xif True else 0
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
但它似乎仍然适用于其他类型的文字:
>>> {'hello'}if False else 'potato'
'potato'
Run Code Online (Sandbox Code Playgroud)
这里发生了什么,它是出于某种原因故意成为语法的一部分吗?这个奇怪的怪癖是一种已知/记录的行为吗?
我正在尝试使用Python 3.6.通过新代码,我偶然发现了这个新语法:
f"My formatting string!"
Run Code Online (Sandbox Code Playgroud)
看来我们可以这样做:
>>> name = "George"
>>> print(f"My cool string is called {name}.")
My cool string is called George.
Run Code Online (Sandbox Code Playgroud)
任何人都可以对这个内部运作有所了解吗?特别是f前缀字符串可以采用的变量范围是多少?
python ×10
python-2.x ×2
boolean ×1
class ×1
comments ×1
constructor ×1
cpython ×1
deque ×1
destructor ×1
dictionary ×1
environment ×1
f-string ×1
grammar ×1
hash ×1
list ×1
path ×1
popen ×1
python-2.7 ×1
python-3.6 ×1
scope ×1
set ×1
subprocess ×1
syntax ×1