class POLL_BASE(object): pass class POLL_READ(POLL_BASE): pass class POLL_WRITE(POLL_BASE): passNo I can inspect whether function returns a final value or a hint that I need to poll its socket to wait for more data.
rv = work() if issubclass(rv, p.POLL_BASE): print "work() returned %s" % rv # poll socket else: # we are done!Now while debugging it you'll notice that
print
statement above will output this:
work() returned <class '__main__.POLL_WRITE'>The above is readable, but I wanted something more pretty. However trying to define
__str__
method on POLL_BASE
class did not help - in fact it will be invoked on POLL_BASE
instances but not POLL_BASE
itself.
Here is the trick: since __str__
is invoked on instances, then we need to define it on instance class. The "class" of POLL_BASE
is type
so we can define our own metaclass for POLL_BASE
:
class POLL_META(type): # This is for fancy printing of POLL_* class names def __str__(cls): return cls.__name__ class POLL_BASE(object): __metaclass__ = POLL_METANow our fancy printing will work:
work() returned POLL_WRITE
No comments:
Post a Comment