給定函數foobar
如何檢查它是否爲Tornado預期的發電機?如何檢查python函數是否是龍捲風發電機
In [1]: from tornado import gen
In [2]: @gen.coroutine
...: def foobar():
...: print 'boom'
...:
我無法找到任何屬性,這可能表明,它是由一個gen.coroutine
給定函數foobar
如何檢查它是否爲Tornado預期的發電機?如何檢查python函數是否是龍捲風發電機
In [1]: from tornado import gen
In [2]: @gen.coroutine
...: def foobar():
...: print 'boom'
...:
我無法找到任何屬性,這可能表明,它是由一個gen.coroutine
有檢測這個沒有什麼好辦法,即使@coroutine
進行了修改,設置一些屬性,這將在情況下,當使用多個裝飾(例如,處理程序可能既@authenticated
和@coroutine
裝飾,以及@authenticated
裝飾的失敗包裝將隱藏任何@coroutine
加)
此外,許多功能(包括核心旋風的方法,如AsyncHTTPClient.fetch
或IOStream
大多數方法)在技術上不協程,但它們可以被稱爲如果他們。在大多數情況下,最重要的問題不是「這是一個協程」,而是「這是否返回Future
」。在沒有調用函數的情況下,沒有辦法在Python中確定它。
我最終編寫了自己的裝飾器,它用龍捲風的協同程序裝飾了該函數,並添加了一個可以檢查的標誌。不理想,但爲我提供了一種方式在執行函數之前**在函數傳遞時進行各種合理性檢查。 – Mikhail
裝飾正確我無法找到一種令人滿意的方式從現有的裝飾gen.coroutine
反思它。
我不確定這是否對您有幫助,但是如果您有對特定修飾器本身的控制權,那麼您可以選擇簡單地將屬性添加到該功能本身。
>>> def my_gen_coroutine(f):
... f = gen.coroutine(f)
... f.is_a_tornado_generator = True
... return f
...
>>> @my_gen_coroutine
... def foobar():
... print 'boom'
...
>>> foobar.is_a_tornado_generator
True
>>> foobar()
boom
<tornado.concurrent.Future at 0x1397d50>
當然,你可以使用getattr(some_function, 'is_a_tornado_generator', False)
當你不知道該屬性是否存在與否。
:(是的,但我不想要求我的庫的用戶使用自定義裝飾器...雖然從我的在線搜索這成爲最合理的解決方案 – Mikhail
也許在'foobar.func_code.co_filename' – wim
然後在那裏搜索單詞'gen'?看起來很不舒服,但比我發現的其他東西都更接近 – Mikhail
看起來非常黑客和跛腳,這就是爲什麼我評論而不是回答。但我找不到更好的python2 – wim