小编wim*_*wim的帖子

在python中定义类的"boolness"

为什么这不是天真的预期?

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 boolean class python-2.x python-2.7

64
推荐指数
3
解决办法
1万
查看次数

如何实现Python中的deques,以及它们何时比列表更糟糕?

我最近开始研究如何在Python中实现各种数据结构,以使我的代码更高效.在调查列表和deques的工作原理时,我发现当我想要移位和卸载时,我可以获得好处,从列表中的O(n)减少到deques中的O(1)的时间(列表被实现为具有固定长度的数组,具有每次在前面插入某些东西时都要完全复制......).我似乎无法找到的是deque如何实现的具体细节,以及它的缺点与列表的细节.有人可以在这两个问题上启发我吗?

python deque

63
推荐指数
4
解决办法
3万
查看次数

如何强制删除python对象?

我很好奇__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__()在解释器退出时仍然存在的对象调用方法.

  1. 怎么能保证Foo解释器退出时存在的任何实例都关闭了吧?
  2. 在上面的代码片段中,条形图是关闭del foo还是gc.collect()......或者两者都没有?如果你想更好地控制那些细节(例如,当对象未被引用时应该关闭条形图)实现它的常用方法是什么?
  3. __del__被调用时能够保证所有的__init__已经叫什么名字?如果__init__举起怎么样?

python constructor garbage-collection destructor reference-counting

61
推荐指数
3
解决办法
11万
查看次数

OrderedDict理解

我可以在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

60
推荐指数
3
解决办法
1万
查看次数

python子进程Popen环境PATH?

我对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)

python environment subprocess path popen

56
推荐指数
2
解决办法
6万
查看次数

Set literal给出了set函数调用的不同结果

为什么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.可能与类似问题的根本原因相同)

python hash set python-2.x python-internals

56
推荐指数
2
解决办法
2667
查看次数

嵌套列表理解如何工作的解释?

我理解这一点没有问题:

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],有人能解释一下它是如何工作的吗?

python list

55
推荐指数
7
解决办法
2万
查看次数

Python的中线评论?

我想知道是否有任何方法可以注释掉部分行,就像你可以用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 syntax comments

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

为什么这不是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 grammar conditional-expressions

52
推荐指数
1
解决办法
2261
查看次数

python-3.6中带有'f'前缀的字符串

我正在尝试使用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 scope string-formatting python-3.6 f-string

52
推荐指数
3
解决办法
2万
查看次数