缓存
- from functools import wraps
- lineseq = '==' * 20
- def memo( func ):
- cache = {}
- @wraps( func )
- def wrapper( *args ):
- result = cache.get( args )
- if result is None:
- result = func( *args )
- cache[args] = result
- return result
- return wrapper
- @memo
- def fib( n ):
- if n < 2:
- return n
- return fib( n - 1 ) + fib( n - 2 )
- print fib( 10 )
from functools import wraps
lineseq = '==' * 20
def memo( func ):
cache = {}
@wraps( func )
def wrapper( *args ):
result = cache.get( args )
if result is None:
result = func( *args )
cache[args] = result
return result
return wrapper
@memo
def fib( n ):
if n < 2:
return n
return fib( n - 1 ) + fib( n - 2 )
print fib( 10 )
注册函数信息
- import time
- def logger( func ):
- @wraps( func )
- def deco( *args, **kwargs ):
- start_time = time.time()
- result = func( *args, **kwargs )
- end_time = time.time()
- print 'function = {0}'.format( func.__name__ )
- print 'arguments = {0}{1}'.format( args, kwargs )
- print 'return = {0}'.format( result )
- print 'time = %.6f sec'%( start_time - end_time )
- return result
- return deco
- @logger
- def sum_num( a, b, c ):
- return a + b + c
import time
def logger( func ):
@wraps( func )
def deco( *args, **kwargs ):
start_time = time.time()
result = func( *args, **kwargs )
end_time = time.time()
print 'function = {0}'.format( func.__name__ )
print 'arguments = {0}{1}'.format( args, kwargs )
print 'return = {0}'.format( result )
print 'time = %.6f sec'%( start_time - end_time )
return result
return deco
@logger
def sum_num( a, b, c ):
return a + b + c
参数检查
- from itertools import izip
- rpc_info = {}
- def xmlrpc( in_args = (), out_args = ( type( None ), ) ):
- def _check_types( elements, types ):
- if len( elements ) != len( types ):
- raise TypeError( 'argument count is wrong' )
- typed = enumerate( izip( elements, types ) )
- for index, couple in typed:
- arg, type_ = couple
- if isinstance( arg, type_ ):
- continue
- raise TypeError( 'arg %d should be %s'%( index, type_ ) )
- def _xmlrpc( func ):
- function_name = func.__name__
- rpc_info[function_name] = ( in_args, out_args )
- def __xmlrpc( *args ):
- check_args = args[1:]
- _check_types( check_args, in_args )
- result = func( *args )
- if not type( result ) in ( tuple, list ):
- check_results = ( result, )
- else:
- check_results = result
- _check_types( check_results, out_args )
- return result
- return __xmlrpc
- return _xmlrpc
- class RPCView( object ):
- @xmlrpc( ( int, int ) )
- def method1( self, int_a, int_b ):
- print 'recevied %d and %d'%( int_a, int_b )
- @xmlrpc( ( str, ), ( int, ) )
- def method2( self, info ):
- print 'received %s'%( info )
- return 0
- a = RPCView()
- a.method1( 12, 21 )
from itertools import izip
rpc_info = {}
def xmlrpc( in_args = (), out_args = ( type( None ), ) ):
def _check_types( elements, types ):
if len( elements ) != len( types ):
raise TypeError( 'argument count is wrong' )
typed = enumerate( izip( elements, types ) )
for index, couple in typed:
arg, type_ = couple
if isinstance( arg, type_ ):
continue
raise TypeError( 'arg %d should be %s'%( index, type_ ) )
def _xmlrpc( func ):
function_name = func.__name__
rpc_info[function_name] = ( in_args, out_args )
def __xmlrpc( *args ):
check_args = args[1:]
_check_types( check_args, in_args )
result = func( *args )
if not type( result ) in ( tuple, list ):
check_results = ( result, )
else:
check_results = result
_check_types( check_results, out_args )
return result
return __xmlrpc
return _xmlrpc
class RPCView( object ):
@xmlrpc( ( int, int ) )
def method1( self, int_a, int_b ):
print 'recevied %d and %d'%( int_a, int_b )
@xmlrpc( ( str, ), ( int, ) )
def method2( self, info ):
print 'received %s'%( info )
return 0
a = RPCView()
a.method1( 12, 21 )
代理
- class User( object ):
- def __init__( self, role ):
- self.roles = role
- class Unauthorized( Exception ):
- pass
- def protect( role ):
- def _protect( function ):
- def __protect( *args, **kwargs ):
- user = globals().get( 'user' )
- if user is None or role not in user.roles:
- raise Unauthorized( 'I will not tell you' )
- return function( *args, **kwargs )
- return __protect
- return _protect
- tarek = User( ( 'admin', 'user' ) )
- bill = User( ( 'user', ) )
- class MySecrets( object ):
- @protect( 'admin' )
- def waffle_recipe( self ):
- print 'use tons of butter!'
- these_are = MySecrets()
- #these_are.waffle_recipe()
- user = tarek
- these_are.waffle_recipe()
- these_are = bill
- these_are.waffle_recipe()
class User( object ):
def __init__( self, role ):
self.roles = role
class Unauthorized( Exception ):
pass
def protect( role ):
def _protect( function ):
def __protect( *args, **kwargs ):
user = globals().get( 'user' )
if user is None or role not in user.roles:
raise Unauthorized( 'I will not tell you' )
return function( *args, **kwargs )
return __protect
return _protect
tarek = User( ( 'admin', 'user' ) )
bill = User( ( 'user', ) )
class MySecrets( object ):
@protect( 'admin' )
def waffle_recipe( self ):
print 'use tons of butter!'
these_are = MySecrets()
#these_are.waffle_recipe()
user = tarek
these_are.waffle_recipe()
these_are = bill
these_are.waffle_recipe()
上下文提供者
- from threading import RLock
- lock = RLock()
- def synchronized( function ):
- def _synchronized( *args, **kwargs ):
- lock.acquire()
- try:
- return function( *args, **kwargs )
- finally:
- lock.release()
- return _synchronized
- @synchronized
- def thread_safe():
- pass