git-svn-id: https://duplicati.googlecode.com/svn/trunk@11 59da171f-624f-0410-aa54-27559c288bec
54 lines
1.7 KiB
Python
54 lines
1.7 KiB
Python
###########################################################################
|
|
#
|
|
# Psyco class support module.
|
|
# Copyright (C) 2001-2002 Armin Rigo et.al.
|
|
|
|
"""Psyco class support module.
|
|
|
|
'psyco.classes.psyobj' is an alternate Psyco-optimized root for classes.
|
|
Any class inheriting from it or using the metaclass '__metaclass__' might
|
|
get optimized specifically for Psyco. It is equivalent to call
|
|
psyco.bind() on the class object after its creation.
|
|
|
|
Note that this module has no effect with Python version 2.1 or earlier.
|
|
|
|
Importing everything from psyco.classes in a module will import the
|
|
'__metaclass__' name, so all classes defined after a
|
|
|
|
from psyco.classes import *
|
|
|
|
will automatically use the Psyco-optimized metaclass.
|
|
"""
|
|
###########################################################################
|
|
|
|
__all__ = ['psyobj', 'psymetaclass', '__metaclass__']
|
|
|
|
|
|
# Python version check
|
|
try:
|
|
from _psyco import compacttype
|
|
except ImportError:
|
|
class psyobj: # compatilibity
|
|
pass
|
|
psymetaclass = None
|
|
else:
|
|
# version >= 2.2 only
|
|
|
|
import core
|
|
from types import FunctionType
|
|
|
|
class psymetaclass(compacttype):
|
|
"Psyco-optimized meta-class. Turns all methods into Psyco proxies."
|
|
|
|
def __new__(cls, name, bases, dict):
|
|
bindlist = dict.get('__psyco__bind__')
|
|
if bindlist is None:
|
|
bindlist = [key for key, value in dict.items()
|
|
if isinstance(value, FunctionType)]
|
|
for attr in bindlist:
|
|
dict[attr] = core.proxy(dict[attr])
|
|
return super(psymetaclass, cls).__new__(cls, name, bases, dict)
|
|
|
|
psyobj = psymetaclass("psyobj", (), {})
|
|
__metaclass__ = psymetaclass
|