python:有没有办法在with语句中获取代码

时间:2011-02-08 06:54:51

标签: python with-statement

我希望这会奏效:

class A:
    def __enter__(self, code):
       print code

    def __exit__(..):
       pass

然后:

with A():
   f()
   g()

会打印:

f()
g()

具体来说,我的目的是获取此代码并从中创建一个函数。我可以这样做:with runInThreads()with runManyTimesTillSuccess(),..

4 个答案:

答案 0 :(得分:6)

以便携式,语言定义的方式,没有。但是,withhacks模块提供了几个CPython特定hackery的示例,可以让您做各种创造性的事情。

然而,这更适合玩游戏 - 函数和生成器仍然是在Python中使用可重用代码块的唯一官方方式。

答案 1 :(得分:3)

以下是如何使用带参数的装饰器:

>>> def manytimes(n):
    def decorate(fn):
        for i in range(n):
            fn()
    return decorate

>>> @manytimes(3)
def _():
    print("hello")


hello
hello
hello

答案 2 :(得分:1)

你为什么不使用装饰师?

我刚尝试过(我这里仍然有python 2.6.4,但它肯定也适用于新版本)

def decorate(fn):
    print "Got", fn
    return "Anything"

def foo():
    @decorate
    def bar(): pass
    print bar

foo()
foo()

它给出了:

Got <function bar at 0x01EAD4B0>
Anything
Got <function bar at 0x01EAD4B0>
Anything

所以你可以很容易地做到:

any code...
@runInThreads
def _():
    whatever...

您甚至可以在函数中定义_任意次。

PS:我从link读了withhacks,但想到这一点并想在那里发表评论只是为了注意comments there中已经提出了同样的技术。

答案 3 :(得分:0)

使用ncoghlan的建议我去了http://pypi.python.org/pypi/withhacks并关闭了代码: http://code.google.com/p/ouspg/wiki/AnonymousBlocksInPython?ts=1253546882&updated=AnonymousBlocksInPython

所以我可以这样做:

from blocks import takes_block

@takes_block
def manyTimes(block):
   for i in range(5):
      block()


 with manyTimes():
     print 'a'
     print 'b'

哪些打印输出:a b 5次。