3

私はこれがうまくいくことを望んでいました:

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

    def __exit__(..):
       pass

その後:

with A():
   f()
   g()

印刷します:

f()
g()

具体的には、このコードから関数を作成することを意図しています。だから私はできる:with runInThreads()またはwith runManyTimesTillSuccess()、..

4

4 に答える 4

6

移植可能な言語定義の方法では、いいえ。ただし、withhacksモジュールは、あらゆる種類の創造的なことを可能にする CPython 固有のハッカーの例をいくつか提供します。

ただし、それはもっと遊んでみるためのものです。関数とジェネレーターは、Python で再利用可能なコード ブロックを操作する唯一の公式な方法です。

于 2011-02-08T07:10:21.050 に答える
3

引数を指定してデコレータを使用する方法は次のとおりです。

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

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


hello
hello
hello
于 2011-02-08T12:25:45.070 に答える
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: 私はwithhacksからのリンクを読みましたが、これを考えて、同じテクニックが既にコメントで提案されていることに気付くためだけにそこにコメントしたかったのです。

于 2011-02-08T07:55:19.913 に答える
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 b5 回。

于 2011-02-08T07:51:24.093 に答える