Discuss / Python / 自实现partial

自实现partial

Topic source

总算实现了官方partial的部分功能

import functools

#测试函数

def my_f(name, city='火星', age=18, gender='M'): print('%s来自%s,年龄%i.性别:%s' % (name, city, age, gender))

#自实现偏函数

def my_partial(func, *args, **kw): @functools.wraps(func) def ff(*argss, **kww): tmp_kw = kw.copy() if len(kww) != 0: for k in kww: tmp_kw[k] = kww.get(k) arg = args + argss if len(arg) != 0: return func(*arg, **tmp_kw) else: func(**tmp_kw) return ff

#测试# mxf = my_partial(my_f, city='北京', age=21) xf = functools.partial(my_f, city='北京', age=21)

mxf('张三', city='上海') xf('张三', city='上海') my_f('张三', city='上海') mxf('李四', age=17) xf('李四', age=17) my_f('李四', age=17) mxf('王五', gender='F') xf('王五', gender='F') my_f('王五', gender='F') mxf('赵六', city='黎巴嫩') xf('赵六', city='黎巴嫩') my_f('赵六', city='黎巴嫩')

输出结果

张三来自上海,年龄21.性别:M 张三来自上海,年龄21.性别:M 张三来自上海,年龄18.性别:M 李四来自北京,年龄17.性别:M 李四来自北京,年龄17.性别:M 李四来自火星,年龄17.性别:M 王五来自北京,年龄21.性别:F 王五来自北京,年龄21.性别:F 王五来自火星,年龄18.性别:F 赵六来自黎巴嫩,年龄21.性别:M 赵六来自黎巴嫩,年龄21.性别:M 赵六来自黎巴嫩,年龄18.性别:M

有一行很重要tmp_kw = kw.copy().在这个上面耽误了好半天.不加这一行在函数调用时的参数赋值会直接改变到partial中赋的默认值

金钟铉

#2 Created at ... [Delete] [Delete and Lock User]

不用if len(arg) != 0 *arg输出的是()里的数据,没有的话不会影响**tmp_kw

一盒噪噪

#3 Created at ... [Delete] [Delete and Lock User]

有几个建议:

①判断arg 是否有元素,这一步无意义,可省略,直接return func(*arg, **kw)即可

因为return中调用func时的参数也是 *arg   意思是一次传入列表/元组中的每个元素

列表为空时,即不传入任何元素

(代码有一个不成文的规定,尽量只用一个出口,即只有一个return,所以尽量不要把if-else 用做return中)

② 其实不需要arg=args+argss了,可以直接在return中加入 *args, *argss

③字典有一个update函数,可以把一个字典/字典元素添加进另一个字典中,且新字典会直接覆盖与原字典中key相同的value,不需要用for循环,也不需要前面的 if len(kww) != 0

一盒噪噪

#4 Created at ... [Delete] [Delete and Lock User]

def partial(func, *arg, **kw):

    @functools.wraps(func)

    Kw = kw.copy()

    def call(*args, **kw):

        Kw.update(kw)

        return func(*arg,*args, **Kw)    

    return call


  • 1

Reply