小编max*_*max的帖子

python:是否可以要求函数的参数都是关键字?

为了避免明显的错误,我想阻止使用某些函数的位置参数.有没有办法实现这一目标?

python coding-style function python-3.x

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

什么决定了调试器的运行时性能

我尝试使用Wing IDE(v.4.1.3)和Komodo IDE(v.7.0.0)调试Python 3.因为,预计调试器会增加大量的运行时开销.但令我惊讶的是调试器之间的差异.

以下是同一程序的运行时间.没有断点或其他任何东西,只是没有任何实际调试的常规运行:

  • 由python解释器执行:26秒
  • 由调试器#1执行:137秒
  • 由调试器#2执行:1143秒

我将调试器称为匿名#1和#2,以免这成为其中一个的无意(并可能被误导)广告.

其中一个调试器真的是8倍"更快"吗?

或者是否有一些设计权衡,更快的调试器放弃一些功能,或精度,或鲁棒性,或其他什么,以换取更快的速度?如果是这样,我想知道这些细节,无论是专门用于Wing/Komodo还是一般的Python调试器.

python debugging performance python-3.x

10
推荐指数
1
解决办法
3188
查看次数

自动装饰类中的每个实例方法

我想将相同的装饰器应用于给定类中的每个方法,而不是那些以开始和结束方式开始的方法__.

在我看来,使用类装饰器应该是可行的.是否有任何陷阱需要注意?

理想情况下,我也希望能够:

  1. 通过使用特殊装饰器标记它们来禁用某些方法的此机制
  2. 也为子类启用此机制
  3. 即使对于在运行时添加到此类的方法,也启用此机制

[注意:我使用的是Python 3.2,所以如果这依赖于最近添加的功能,我会很好.

这是我的尝试:

_methods_to_skip = {}

def apply(decorator):
  def apply_decorator(cls):
    for method_name, method in get_all_instance_methods(cls):
      if (cls, method) in _methods_to_skip:
        continue
      if method_name[:2] == `__` and method_name[-2:] == `__`:
        continue
      cls.method_name = decorator(method)
  return apply_decorator

def dont_decorate(method):
  _methods_to_skip.add((get_class_from_method(method), method))
  return method
Run Code Online (Sandbox Code Playgroud)

以下是我遇到的问题:

  • 如何实现get_all_instance_methods功能
  • 不确定我的cls.method_name = decorator(method)线是否正确
  • 如何对运行时添加到类中的任何方法执行相同操作
  • 如何将其应用于子类
  • 如何实施 get_class_from_method

python class decorator python-3.x

10
推荐指数
1
解决办法
1743
查看次数

`inspect.trace()`vs`traceback`

我对两个对象之间的区别感到困惑:

  • inspect.trace()正在处理异常时返回的帧列表
  • sys.exc_info()[2](或在调用中传递sys.excepthook)返回的回溯

这两个对象是否包含相同的信息,只是组织成不同的数据结构?如果没有,那么另一个没有?

python debugging stack-trace python-3.x

10
推荐指数
1
解决办法
2134
查看次数

强制线程阻止所有其他线程执行

更新:

这个答案表明我在2013年4月所做的事情是不可能的.然而,这似乎与Alex Martelli在Python Cookbook中所说的相矛盾(第624页,第3版):

返回时,PyGILState_Ensure()始终保证调用线程具有对Python解释器的独占访问权.即使调用C代码正在运行解释器未知的其他线程,也是如此.

文档似乎也建议GIL可以获得,这会给我带来希望(除了我不认为我可以PyGILState_Ensure()从纯python代码调用,如果我创建一个C扩展来调用它,我不知道如何嵌入我memory_daemon()的那个).

也许我误读了答案或Python Cookbook和文档.

原始问题:

我想要一个给定的线程(来自threading模块)来阻止任何其他线程在其代码的某个段执行时运行.实现它的最简单方法是什么?

显然,最大限度地减少其他线程中的代码更改,避免使用C和直接操作系统调用,并使其成为Windows和Linux的跨平台.但实际上,我很乐意为我的实际环境提供任何解决方案(见下文).

环境:

  • CPython的
  • python 3.4(如果有帮助,可以升级到3.5)
  • Ubuntu 14.04

使用案例:

出于调试目的,我计算所有对象使用的内存(如报告所示gc.get_objects()),并打印一些摘要报告sys.stderr.我在一个单独的线程中执行此操作,因为我希望从其他线程异步传递此摘要; 我放在循环time.sleep(10)的末尾,while True进行实际的内存使用计算.但是,内存报告线程需要一段时间来完成每个报告,并且我不希望所有其他线程在内存计算完成之前继续前进(否则,内存快照将很难解释).

示例(澄清问题):

import threading as th
import time

def report_memory_consumption():
  # go through `gc.get_objects()`, check their size and print a summary
  # takes ~5 min to run

def memory_daemon():
  while True:
    # all other threads should not do anything until this call …
Run Code Online (Sandbox Code Playgroud)

python multithreading python-multithreading python-3.x

10
推荐指数
1
解决办法
2608
查看次数

python输入模块中Set,FrozenSet,MutableSet和AbstractSet有什么区别?

我试图用类型注释我的代码但是当涉及到集合时我有点困惑.我在PEP 484中读到了一些观点:

注意:Dict,List,Set和FrozenSet主要用于注释返回值.对于参数,更喜欢下面定义的抽象集合类型,例如Mapping,Sequence或AbstractSet.

设置,重命名为AbstractSet.此名称更改是必需的,因为键入模块中的Set表示使用泛型的set().

但这没有用.

我的第一个问题是:Set,FrozenSet,MutableSet和AbstractSet之间的共性和区别是什么?

我的第二个问题是:如果我尝试,为什么?

from collections import FrozenSet
Run Code Online (Sandbox Code Playgroud)

我明白了

ImportError: cannot import name 'FrozenSet'
Run Code Online (Sandbox Code Playgroud)

我使用的是Python 3.4,我已经通过pip安装了mypy-lang.

python type-hinting python-3.x frozenset

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

在for循环中使用生成器send()

我实现了图遍历作为生成器函数,它产生了被访问的节点.

有时用户需要告诉遍历函数不应该遵循从特定节点传出的边缘; 为了支持这一点,遍历检查发送回它的值(使用生成器send()方法),如果是True,则将节点视为用于遍历目的的叶子.

问题是最简单的用户循环有点长:

# simplified thanks to @tobias_k
# bfs is the traversal generator function
traversal = bfs(g, start_node)
try:
  n = next(traversal)
  while True:
    # process(n) returns True if don't want to follow edges out of n
    n = traversal.send(process(n))
except StopIteration:
    pass
Run Code Online (Sandbox Code Playgroud)

有没有办法改善这个?

我认为这样的事情应该有效:

for n in bfs(g, start_node):
  ???.send(process(n))
Run Code Online (Sandbox Code Playgroud)

但我觉得我缺少一些python语法的知识.

python generator python-3.x python-3.5

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

使用Mypy本地存根

我正在尝试Python 3.5引入的输入提示,并通过使用本地存根作为mypy的输入提示来解决问题.

我做的实验是创建包含kk.py的

def type_check(a):
    pass
Run Code Online (Sandbox Code Playgroud)

另外,我把kk.pyi包含在内

def type_check(a: int):...
Run Code Online (Sandbox Code Playgroud)

在同一目录中.通过这种方式,我试图通过将字符串传递给kk.py中的type_check来触发"赋值中的ncompatible类型"的错误.但是,当我运行mypy kk.py并且没有错误.

因此我尝试了mypy doc建议的另一种方法,即将环境变量MYPYPATH设置为〜/ some/path/stub并将kk.pyi放在目录中.然而,我得到了同样的错误.

有人可以帮我吗?

这是关于如何使用本地存根的mypy wiki .

python mypy

10
推荐指数
1
解决办法
1170
查看次数

`multiprocessing.pool.Pool`中`context`参数的含义是什么?

context是构造函数中的可选参数class multiprocessing.pool.Pool.文档只说:

context可用于指定用于启动工作进程的上下文.通常使用上下文对象的函数multiprocessing.Pool()Pool()方法创建池.在两种情况下,上下文都是适当的.

它没有说明"上下文对象"是什么,为什么class Pool构造函数需要它,以及它在所提到的场景中"适当地设置"意味着什么.

python multiprocessing python-3.x

10
推荐指数
1
解决办法
2616
查看次数

为什么asyncio.Future与concurrent.futures.Future不兼容?

这两个类代表了并发编程的优秀抽象,因此它们不支持相同的API有点令人不安.

具体来说,根据文档:

asyncio.Future几乎兼容concurrent.futures.Future.

区别:

  • result()并且exception()不要采用超时参数并在未来尚未完成时引发异常.
  • 注册的回调add_done_callback()总是通过事件循环调用call_soon_threadsafe().
  • 此类与包中的wait()as_completed()函数不兼容concurrent.futures.

以上列表实际上是不完整的,还有一些差异:

  • running() 方法不存在
  • result()并且exception()可能会提高InvalidStateError,如果叫太早

这些中的任何一个是由于事件循环的固有特性导致这些操作无法实现还是太麻烦而无法实现?

与之相关的差异是什么意思add_done_callback()?无论哪种方式,回调都保证在期货结束后的某个未指定的时间发生,所以这两个类之间是否完全一致?

python concurrency python-3.x python-asyncio concurrent.futures

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