greenlet如何实现? Python使用C栈作为解释器,它堆 – 分配Python栈帧,但除此之外,它是如何分配/交换栈,它是如何挂钩到解释器和函数调用机制,以及它如何与C扩展交互? (任何怪癖)? 源代码中greenlet.c的顶部有一些注释,但它们有点不透明。 FWIW我来自一个不熟悉CPython内部但熟悉底层系统编程,C,线程,事件,协程/合作线程,内核编程等等的人。 (有些数据点:它们不使用ucontext.h ,它们在每个上下文切换上执行2次memcpy,alloc和free 。)
Jinja2macros如何处理额外的参数和kwargs? 文件不是完全清楚的。 例如,这显然是错误的: {% macro example_1(one, two, **kwargs) %} do macro stuff {% endmacro %} 这导致了 jinja2.exceptions.TemplateSyntaxError TemplateSyntaxError: expected token 'name', got '**' 该文件说: kwargs 像可变参数,但关键字参数。 所有未使用的关键字参数都存储在这个特殊variables中。 不幸的是,任何额外的关键字参数组合是一个错误, {% macro example_2(one, two) %} do macro stuff {% endmacro %} {{ example_2(one, two, test='test') }} TypeError: macro 'example_2' takes no keyword keyword argument 'test' 我没有任何例子,也没有在Jinja2的源代码atm中大肆渲染。 目前我的文档还不清楚。 […]
我已经看到了各种各样的例子和其他类似的问题,但我似乎无法find一个完全符合我的情况的例子。 我觉得自己好像总是问这个问题,因为有这么多类似的问题,但我似乎无法“正确地”做到这一点。 这是我的项目: user_management (package) | |——- __init__.py | |——- Modules/ | | | |—– __init__.py | |—– LDAPManager.py | |—– PasswordManager.py | |——- Scripts/ | | | |—– __init__.py | |—– CreateUser.py | |—– FindUser.py 如果我将“CreateUser.py”移动到主user_management目录,我可以很容易地使用: "import Modules.LDAPManager"来导入LDAPManager.py —这是可行的。 我不能做的(我想做的)是在Scripts子文件夹中保存CreateUser.py,然后导入LDAPManager.py。 我希望通过使用"import user_management.Modules.LDAPManager.py"来实现这一点。 这不起作用。 简而言之,我可以通过Python文件轻松地查看层次结构中的更深层次的内容,但是我无法获得Python脚本来引用一个目录并将其导入另一个目录。 请注意,我能够解决我的问题使用: sys.path.append(os.path.join(os.path.dirname(__file__), '..')) import Modules.LDAPManager as LDAPManager 我听说这是不好的做法,气馁。 脚本中的文件是直接执行的(脚本中的init .py甚至是必要的?)。 […]
我正在运行Python 2.5,因此这个问题可能不适用于Python 3.当您使用多重inheritance创build钻石类层次结构并创build派生类的对象时,Python将执行Right Thing(TM)。 它调用派生类的构造函数,然后从左到右列出父类,然后是祖父类。 我熟悉Python的MRO ; 那不是我的问题。 我很好奇从超级对象返回的对象实际上是如何pipe理的,以正确的顺序在父类中调用超级调用。 考虑这个例子代码: #!/usr/bin/python class A(object): def __init__(self): print "A init" class B(A): def __init__(self): print "B init" super(B, self).__init__() class C(A): def __init__(self): print "C init" super(C, self).__init__() class D(B, C): def __init__(self): print "D init" super(D, self).__init__() x = D() 代码做直观的事情,它打印: D init B init C […]
假设我有一个名为bar的包,它包含bar.py : a = None def foobar(): print a 和__init__.py : from bar import a, foobar 然后我执行这个脚本: import bar print bar.a bar.a = 1 print bar.a bar.foobar() 这是我所期望的: None 1 1 这是我得到的: None 1 None 任何人都可以解释我的误解?
在pdb , next条指令不会超越列表parsing,而是逐步执行每个迭代。 有没有一种方法可以让它们在列表理解之后的下一行继续debugging呢? 我不得不求助于列出代码,在下一行设置一个断点,然后继续执行到下一个断点。 这是烦人的,我觉得必须有更好的方法。
我想在服务器启动(包括开发和生产)上执行这些代码行: from django.core import management management.call_command('syncdb', interactive=False) 把它放在settings.py中不起作用,因为它需要已经加载的设置。 将它们放在视图中并从外部访问该视图也不起作用,因为有一些使用数据库的中间件,这些中间件会失败,不让我访问视图。 把它们放在一个中间件可以工作,但每次访问我的应用程序时都会调用它。 一个可能的解决scheme可能是创build一个完成所有工作的中间件,然后从MIDDLEWARE_CLASSES删除它,这样就不会再调用它了。 我能做到这一点,没有太多的猴子补丁?
我不明白ensure_index中create_index和ensure_index的区别。 在MongoDB索引页面上 ,它说 你可以通过调用ensureIndex()来创build索引 但是在pymongo中有两个不同的命令create_index和ensure_index ,并且create index的文档有: 与create_index()不同,它试图无条件地创build一个索引,ensure_index()利用驱动程序中的一些caching,只尝试创build可能不存在的索引。 当PyMongo创build(或确保)索引时,“记住”ttl秒。 在此限制内重复调用ensure_index()将是轻量级的 – 它们不会尝试实际创build索引。 我正确的理解, ensure_index将创build一个永久性的索引,还是我需要使用create_index呢?
所以,再一次,我做了一个不错的Python程序,使我的生活变得更加容易,并节省了大量的时间。 当然,这涉及一个virtualenv,用virtualenvwrapper的mkvirtualenv函数制作而成。 该项目有一个requirements.txt文件与几个所需的库(请求太:D)和程序将不运行没有这些库。 我正在尝试添加一个bin/run-app可执行的shell脚本,它将在我的path中(实际上是符号链接)。 现在,在这个脚本里面,我需要切换到virtualenv才能运行这个程序。 所以我把这个放进去 #!/bin/bash # cd into the project directory workon "$(cat .venv)" python main.py 文件.venv包含virtualenv名称。 但是当我运行这个脚本时,我得到了workon: command not found错误。 当然,我有我的bashrc中的virtualenvwrapper.sh源,但它似乎并没有在这个shell脚本中可用。 那么,我怎样才能在这里访问这些virtualenvwrapper函数呢? 还是我这样做是错误的? 你如何启动你的python工具,每个工具都有自己的virtualenv!
在Python中raise和raise from什么区别? try: raise ValueError except Exception as e: raise IndexError 这产生了 Traceback (most recent call last): File "tmp.py", line 2, in <module> raise ValueError ValueError During handling of the above exception, another exception occurred: Traceback (most recent call last): File "tmp.py", line 4, in <module> raise IndexError IndexError 和 try: raise ValueError except Exception […]