`
zuroc
  • 浏览: 1312195 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

Python Trick 两条: 如何还原函数的参数调用+元类与缓存

阅读更多

##1.如何还原函数的参数调用
##什么也不说了,copy and run
##有什么用,自己想象吧

def show_para(func):
    func_id="%s.%s"%(func.__module__,func.__name__)
    varnames=func.func_code.co_varnames
   
    if func.func_defaults:
        varnames_len=len(varnames)
        defaults=[repr(i) for i in func.func_defaults]
        def get_id(args,kwds):
            paras=[repr(i) for i in args]
            len_args=len(args)
            pos=len_args-varnames_len
            if kwds:
                for i in varnames[len_args:]:
                    paras.append(
                        repr(kwds.get(i,defaults[pos]))
                    )
                    pos+=1
            else:
                paras.extend(defaults[pos:])
            return "%s(%s)"%(func_id,",".join(paras))[-250:]
    else:
        def get_id(args,kwds):
            paras=[repr(i) for i in args]
            if kwds:
                for i in varnames[len(args):]:
                    paras.append(
                        repr(kwds[i])
                    )
            return "%s(%s)"%(func_id,",".join(paras))[-250:]
           
    def _func(*args,**kwds):
        print get_id(args,kwds)
        print len(get_id(args,kwds))
    return _func
   
@show_para
def xxx(a,b,c,d="张",e="沈",f="鹏",g=2):
    pass

@show_para
def ooo(a,b,c):
    pass
   
xxx(1,2,3,f=121)

ooo(1,2,3)

########################################################################


##2.元类与缓存
#coding:utf-8

##同样,copy and run
##不做解释,自己想象

from types import ClassType
class mc(object):
    __cache={}
   
    @staticmethod
    def get(id):
        r=mc.__cache.get(id,None)
        print "mc.get\t%s = %s"%(id,r)
        return r

    @staticmethod
    def set(id,value):
        print "mc.set\t%s = %s"%(id,value)
        mc.__cache[id]=value

    @staticmethod
    def delete(id):
        print "mc.delete \t%s"%(id)
        mc.__cache.pop(id)


class MetaMc(type):
    """
    使用该元类的类
    如果自定义__init__必须第一个参数必须是id
    否则,生成的__init__第一个参数默认是id
    """
    def __new__(cls,classname,bases,classdict):
        class_id="%s.%s:"%(classdict['__module__'],classname)

        def init_maker(init):
            if init:
                for i in bases:
                    if isinstance(i,MetaMc):
                        def __init__(self,id,*args,**kwds):
                            return init(self,id,*args,**kwds)
                        return __init__
                def __init__(self,id,*args,**kwds):
                    self.__id=int(id)
                    self.__mc_id="%s%s"%(class_id,id)
                    self.__profile=mc.get(self.__mc_id) or {}
                    init(self,id,*args,**kwds)
            else:
                if bases:
                    if isinstance(bases[0],MetaMc):
                        return None
                    else:
                        def __init__(self,id,*args,**kwds):
                            self.__id=int(id)
                            self.__mc_id="%s%s"%(class_id,id)
                            self.__profile=mc.get(self.__mc_id) or {}
                            return bases[0].__init__(self,*args,**kwds)
                else:
                    def __init__(self,id,*args,**kwds):
                        self.__id=int(id)
                        self.__mc_id="%s%s"%(class_id,id)
                        self.__profile=mc.get(self.__mc_id) or {}
            return __init__

        __init__=init_maker(classdict.get("__init__",None))
       
        if __init__:
            classdict["__init__"]=__init__

        @property
        def id(self):
            return self.__id
        classdict["id"]=id

        if "__repr__" not in classdict:
            def __repr__(self):
                return self.__mc_id
            classdict["__repr__"]=__repr__

        if "__str__" not in classdict:
            def __str__(self):
                return self.__mc_id
            classdict["__str__"]=__str__      
 
        def mc_clean(self):
            self.__profile={}
            mc.delete(self.__mc_id)
        classdict["mc_clean"]=mc_clean
       
        def get_maker(k,v):
            def get(self):   
                profile=self.__profile
                   
                if k in profile:
                    result=profile[k]
                else:
                    result=v.get.im_func(self)
                    profile[k]=result
                    mc.set(self.__mc_id,profile)
                    self.__profile=profile
                return result
            return get

        def set_maker(k,v):
            def set(self,value):
                result=v.set.im_func(self,value)
                self.__profile[k]=value
                mc.set(self.__mc_id,self.__profile)
                return result
            return set

        for k,v in classdict.iteritems():
            if isinstance(v,ClassType):
                has_get=hasattr(v,"get")
                has_set=hasattr(v,"set")
                if has_set and has_get:
                    classdict[k]=property(get_maker(k,v),set_maker(k,v))
                elif has_get:
                    classdict[k]=property(get_maker(k,v))
                elif has_set:
                    classdict[k]=property(fset=set_maker(k,v))
               
        return type.__new__(cls, classname, bases, classdict)



class db:
    name=1
    amount=0
   
class A:
    __metaclass__=MetaMc
   
    class name:
        def get(self):
            return db.name
           
        def set(self,value):
            db.name=value
   
    class amount:
        def get(self):
            return "amount %s"%db.amount
        def set(self,value):
            pass

class B(A):
    pass
   
       
b=B(1)
print b.name
print b.name
print b.name
b.name+=1
print b.name
print b.name
b.mc_clean()
print b.name
print b.id
print type(b.id)

4
0
分享到:
评论
1 楼 huangpengxiao 2008-08-18  
晕 你不解释还真看不懂

相关推荐

    python-trick

    Python-trick,上传的事pdf文档

    python中SVM分类的参数

    ### python中SVM分类的参数详解 #### 一、引言 SVM(Support Vector Machine,支持向量机)作为一种强大的机器学习算法,在文本分类、图像识别、生物信息学等领域有着广泛的应用。尤其是在处理高维数据时,SVM能够...

    python_trick_中文版.pdf

    Python技巧是Python社区中一种独特的交流方式,它通过简短而具有教学性的代码片段来传授Python语言的特性。这些技巧通常是在Twitter上分享的,它们可以是简单的示例,用以解释Python的某个特定概念,也可以是复杂的...

    YOLOv5|YOLOv7|YOLOv8改各种IoU损失函数:YOLOv8涨点Trick,改进添加SIoU损失函数、EIoU损失函数、GIoU损失函数、α-IoU损失函数-CSDN博客.mhtml

    YOLOv5|YOLOv7|YOLOv8改各种IoU损失函数:YOLOv8涨点Trick,改进添加SIoU损失函数、EIoU损失函数、GIoU损失函数、α-IoU损失函数-CSDN博客.mhtml

    python svm算法源码

    同时,SVM也可以通过调整参数进行调优,如使用网格搜索(GridSearchCV)来寻找最优的核函数参数和惩罚项。 总结来说,Python中的SVM算法主要涉及以下几个关键点: 1. 最大间隔分类器的概念与构造。 2. 核函数的使用...

    高效进行数据科学工作的python库和一些trick

    Python在数据处理方面有许多技巧(tricks),可以帮助提高效率和简化任务。以下是一些常用的Python数据处理技巧: 使用Pandas的read_*函数:Pandas库提供了多种读取数据的功能,如read_csv(), read_excel(), read_...

    python的svm分类器

    3. **核函数(Kernel Trick)**:SVM可以使用核函数将数据从原始空间映射到高维特征空间,使得非线性可分问题变得线性可分。常用的核函数有线性核、多项式核、RBF(高斯核)和Sigmoid核。 **使用Python的SVM步骤:*...

    几篇较新的SVM核函数及多类问题的文章

    3. 遗传算法和粒子群优化:这些全局优化方法可以用于寻找更好的核函数参数,以提高模型性能。 4. 处理大规模数据:对于大量样本,可以采用稀疏矩阵存储数据,或者使用在线学习算法,如Stochastic Gradient Descent...

    elem_data.rar_elem.data_python中elem_trick5po_简单的scrapy爬虫类编写_饿了么

    理解Python的基本语法、数据类型、函数、类以及异常处理等概念是必要的。 3. **elem.data和elem_trick5po**:这两个可能是指特定的项目命名或者文件夹名称,它们可能是存放爬取到的数据或者项目特定技巧的地方,...

    重修 Slope Trick(看这篇绝对够!).doc

    Slope Trick 主要针对一类特定的问题——即目标函数为凸函数的动态规划问题。这类问题的特点在于状态转移方程中含有绝对值或分段线性函数等复杂表达式。而Slope Trick 就是用来简化这些复杂表达式的计算过程,通过...

    python-tricks buffet awesome features

    这本书涵盖了多种Python语言的精华,包括但不限于元编程、高级数据结构、函数式编程、错误处理以及优化策略等。 在Python的世界里,元编程是一种强大的工具,它允许程序员在运行时自动生成或修改代码。书中可能会...

    Python Tricks

    1. Python编程哲学:Python的设计哲学是强调代码的可读性和简洁的语法,它鼓励使用英文关键字,并在可能的情况下减少代码的长度。Python的语法允许程序员用极少的代码行来表达概念,其中的空格使用、缩进等规则对...

    基于python实现的水下机器人算法+源码+开发文档(毕业设计&课程设计&项目开发)

    基于python实现的水下机器人算法+源码+开发文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 项目简介: 基本网络模型 cascade rcnn resnext101 pretrained on...

    libsvm python svm库

    2. **核函数(Kernel Trick)**:LIBSVM支持多种核函数,如线性核、多项式核、高斯核(RBF)等,通过非线性映射将数据转换到高维空间,使得原本难以分隔的数据在新的空间中变得容易区分。 3. **C-SVM与ε-SVR**:C-...

    基于python实现手写痕迹文档图像摩尔纹消除源码+项目运行说明.zip

    基于python实现手写痕迹文档图像摩尔纹消除源码+项目运行说明.zip 二、数据分析 **数据划分**:使用1000张做为训练集,81张作为验证集。 官方提供了训练集1081对,测试集A、B各200张。包含以下几个特征: 1.图像...

    Python——机器学习实战——支持向量机

    核函数参数`gamma`,影响核函数的宽度。可以通过交叉验证和网格搜索(`GridSearchCV`)来优化这些参数。 6. **训练模型**:使用`fit`方法拟合模型到训练数据。 7. **预测**:用`predict`方法对测试集进行预测。 8. *...

    python-b_python-B_支持向量机_python_

    此外,Scikit-Learn还提供了`GridSearchCV`工具来进行参数调优,寻找最优的核函数参数和正则化参数。 总之,Python中的支持向量机是一个强大的工具,适用于各种机器学习问题。通过合理选择核函数、调整参数,我们...

    stupid_python_tricks:一堆简短的脚本,说明了python的工作方式

    这使我可以调用简单的方法,例如killing_intervention()并传递上述任何一个参数,但不能同时实现这两个方法的覆盖率和开始时间。 如果您在命令行上运行脚本,它将仅创建一堆这些字典并将其写入控制台。 test_...

    支持向量机(SVM)上机实验报告代码大全

    当数据不是线性可分时,可以使用核函数(Kernel Trick)将数据映射到高维空间,使得在高维空间中数据变得线性可分。常见的核函数有线性核、多项式核、高斯核(RBF)等。高斯核函数(RBF)表达式为: (, ′) = exp...

    利用Python实现支撑向量机+源码+详细注释

    ### 利用Python实现支持向量机:源码与详细注释 #### 一、支持向量机(SVM)简介 支持向量机(Support Vector Machine, SVM)是一种广泛应用于机器学习领域的监督学习算法,主要用于解决二元分类问题。其核心思想...

Global site tag (gtag.js) - Google Analytics