python内置类型的扩展方法

python内置类型的扩展方法,第1张

python内置类型扩展方法

可以使用以下非常聪明的模块在纯Python中完成此 *** 作:

https://pypi.python.org/pypi/forbiddenfruit

例如:

import functoolsimport ctypesimport __builtin__import operatorclass PyObject(ctypes.Structure):    passPy_ssize_t = hasattr(ctypes.pythonapi, 'Py_InitModule4_64') and ctypes.c_int64 or ctypes.c_intPyObject._fields_ = [    ('ob_refcnt', Py_ssize_t),    ('ob_type', ctypes.POINTER(PyObject)),]class SlotsPointer(PyObject):    _fields_ = [('dict', ctypes.POINTER(PyObject))]def proxy_builtin(klass):    name = klass.__name__    slots = getattr(klass, '__dict__', name)    pointer = SlotsPointer.from_address(id(slots))    namespace = {}    ctypes.pythonapi.PyDict_SetItem(        ctypes.py_object(namespace),        ctypes.py_object(name),        pointer.dict,    )    return namespace[name]def die(message, cls=Exception):    """        Raise an exception, allows you to use logical shortcut operators to test for object existence succinctly.        User.by_name('username') or die('Failed to find user')    """    raise cls(message)def unguido(self, key):    """        Attempt to find methods which should really exist on the object instance.    """    return functools.partial((getattr(__builtin__, key, None) if hasattr(__builtin__, key) else getattr(operator, key, None)) or die(key, KeyError), self)class mapper(object):    def __init__(self, iterator, key):        self.iterator = iterator        self.key = key        self.fn = lambda o: getattr(o, key)    def __getattribute__(self, key):        if key in ('iterator', 'fn', 'key'): return object.__getattribute__(self, key)        return mapper(self, key)    def __call__(self, *args, **kwargs):        self.fn = lambda o: (getattr(o, self.key, None) or unguido(o, self.key))(*args, **kwargs)        return self    def __iter__(self):        for value in self.iterator: yield self.fn(value)class foreach(object):    """        Creates an output iterator which will apply any functions called on it to every element        in the input iterator. A kind of chainable version of filter().        E.g:        foreach([1, 2, 3]).__add__(2).__str__().replace('3', 'a').upper()        is equivalent to:        (str(o + 2).replace('3', 'a').upper() for o in iterator)        Obviously this is not 'Pythonic'.    """    def __init__(self, iterator):        self.iterator = iterator    def __getattribute__(self, key):        if key in ('iterator',): return object.__getattribute__(self, key)        return mapper(self.iterator, key)    def __iter__(self):        for value in self.iterator: yield valueproxy_builtin(list)['foreach'] = property(foreach)import stringprint string.join([1, 2, 3].foreach.add(2).str().add(' cookies').upper(), ', ')>>> 3 cookieS, 4 cookieS, 5 cookieS

在那里,感觉不舒服吗?



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5565987.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-14
下一篇2022-12-14

发表评论

登录后才能评论

评论列表(0条)

    保存