2016-03-14 99 views
4

給定函數foobar如何檢查它是否爲Tornado預期的發電機?如何檢查python函數是否是龍捲風發電機

In [1]: from tornado import gen 

In [2]: @gen.coroutine 
    ...: def foobar(): 
    ...:  print 'boom' 
    ...: 

我無法找到任何屬性,這可能表明,它是由一個gen.coroutine

+0

也許在'foobar.func_code.co_filename' – wim

+0

然後在那裏搜索單詞'gen'?看起來很不舒服,但比我發現的其他東西都更接近 – Mikhail

+0

看起來非常黑客和跛腳,這就是爲什麼我評論而不是回答。但我找不到更好的python2 – wim

回答

4

有檢測這個沒有什麼好辦法,即使@coroutine進行了修改,設置一些屬性,這將在情況下,當使用多個裝飾(例如,處理程序可能既@authenticated@coroutine裝飾,以及@authenticated裝飾的失敗包裝將隱藏任何@coroutine加)

此外,許多功能(包括核心旋風的方法,如AsyncHTTPClient.fetchIOStream大多數方法)在技術上不協程,但它們可以被稱爲如果他們。在大多數情況下,最重要的問題不是「這是一個協程」,而是「這是否返回Future」。在沒有調用函數的情況下,沒有辦法在Python中確定它。

+0

我最終編寫了自己的裝飾器,它用龍捲風的協同程序裝飾了該函數,並添加了一個可以檢查的標誌。不理想,但爲我提供了一種方式在執行函數之前**在函數傳遞時進行各種合理性檢查。 – Mikhail

2

裝飾正確我無法找到一種令人滿意的方式從現有的裝飾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)當你不知道該屬性是否存在與否。

+0

:(是的,但我不想要求我的庫的用戶使用自定義裝飾器...雖然從我的在線搜索這成爲最合理的解決方案 – Mikhail