我想编写一个装饰器,它的行为会有所不同,具体取决于它是应用于函数还是方法.
def some_decorator(func):
if the_magic_happens_here(func): # <---- Point of interest
print 'Yay, found a method ^_^ (unbound jet)'
else:
print 'Meh, just an ordinary function :/'
return func
class MyClass(object):
@some_decorator
def method(self):
pass
@some_decorator
def function():
pass
Run Code Online (Sandbox Code Playgroud)
我想inspect.ismethod(),inspect.ismethoddescriptor()和inspect.isfunction()但没有运气.问题是方法实际上既不是绑定方法也不是非绑定方法,而是普通函数,只要它是从类体内访问即可.
我真正想要做的是将装饰器的动作延迟到实际实例化类的程度,因为我需要在其实例范围内调用方法.为此,我想用属性标记方法,然后在调用.__new__()方法时搜索这些属性MyClass.这个装饰器应该工作的类需要从我控制的类继承.您可以将此事实用于您的解决方案.
在正常功能的情况下,延迟不是必需的,装饰者应该立即采取行动.这就是我想要区分这两种情况的原因.
在异步环境中,threading.local不再保证是上下文本地的,因为几个上下文可以在单个线程中共存.大多数异步框架(gevent,eventlet)提供了get_current_context()识别当前上下文的功能.有些提供了一种猴子补丁的方式,threading.local因此它是"greenthreads"或其他特定于框架的上下文的本地.我在扭曲的文档中找不到这样的功能.我该怎么做呢?