import inspect
from functools import wraps
def copy_args_to_internal_fields(fn):
"""Copies the initializer args to internal member fields.
This is a decorator that applies to __init__.
"""
return _copy_args_to_fields(fn, 'copy_args_to_internal_fields', '_')
def copy_args_to_public_fields(fn):
"""Copies the initializer args to public member fields.
This is a decorator that applies to __init__.
"""
return _copy_args_to_fields(fn, 'copy_args_to_public_fields', '')
def _copy_args_to_fields(fn, decorator_name, field_prefix):
if fn.__name__ != '__init__':
raise ValueError('@{0} cannot be applied to non-initializer {1}.{2}'.format(
decorator_name, inspect.getmodule(fn).__name__, fn.__name__))
arg_names, varargs, unused_keywords, unused_defaults = (
inspect.getargspec(fn))
if varargs is not None:
raise ValueError('decorator @{0} cannot be applied to {1}.{2} with *{3}'.format(
decorator_name, inspect.getmodule(fn).__name__, fn.__name__, varargs))
@wraps(fn)
def CopyThenCall(self, *pargs, **kwargs):
for index, parg in enumerate(pargs, start=1):
setattr(self, field_prefix + arg_names[index], parg)
for kwarg, kwvalue in kwargs.iteritems():
setattr(self, field_prefix + kwarg, kwvalue)
fn(self, *pargs, **kwargs)
return CopyThenCall
将
pinject.initializers
模块转换为独立版本:这也不需要^{} package 依赖关系。你知道吗
演示:
相关问题 更多 >
编程相关推荐