我希望这会奏效:
class A:
def __enter__(self, code):
print code
def __exit__(..):
pass
然后:
with A():
f()
g()
会打印:
f()
g()
具体来说,我的目的是获取此代码并从中创建一个函数。我可以这样做:with runInThreads()
或with runManyTimesTillSuccess()
,..
答案 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次。