Python论坛  - 讨论区

标题:[python-chinese] 动态生成函数

2008年01月15日 星期二 11:31

cafeeee cafeeee在gmail.com
星期二 一月 15 11:31:10 HKT 2008

ÓÐÈçÏÂÒ»¸öº¯Êý£º

def s(param):
   # ...
   # ...

Èç¹ûÏë¸ù¾Ýijm=dict("a": 0, "b": 1, "c":None)¶¯Ì¬Éú³ÉÈçϼ¸¸öº¯Êý£¬Ó¦¸ÃÔõô×ö£¿
def a():
   return s(0)

def b():
   return s(1)

def c():
   return s(None)
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20080115/7a620eb5/attachment.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2008年01月15日 星期二 11:46

Jiahua Huang jhuangjiahua在gmail.com
星期二 一月 15 11:46:14 HKT 2008

不知道你说的 dict("a": 0, "b": 1, "c":None) 是什么玩意,
猜测你想说 dict(a=0, b=1, c=None) 或 {"a": 0, "b": 1, "c":None}

>>> m=dict(a=0, b=1, c=None)
>>> for k,v in m.items():
...     exec('def %s(): return s(%s)'%(k,v))
...

2008/1/15 cafeeee <cafeeee at gmail.com>:
> 如果想根据某m=dict("a": 0, "b": 1, "c":None)动态生成如下几个函数,应该怎么做?
> def a():
>     return s(0)
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2008年01月15日 星期二 11:51

BloodMage zhouyisu在gmail.com
星期二 一月 15 11:51:23 HKT 2008

for a,b in dict:
    exec "def %s():\n return %s"%(a,repr(b))

ÔÚ08-1-15£¬cafeeee <cafeeee在gmail.com> дµÀ£º
>
> ÓÐÈçÏÂÒ»¸öº¯Êý£º
>
> def s(param):
>    # ...
>    # ...
>
> Èç¹ûÏë¸ù¾Ýijm=dict("a": 0, "b": 1, "c":None)¶¯Ì¬Éú³ÉÈçϼ¸¸öº¯Êý£¬Ó¦¸ÃÔõô×ö£¿
> def a():
>    return s(0)
>
> def b():
>    return s(1)
>
> def c():
>    return s(None)
>
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20080115/b23e3326/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2008年01月15日 星期二 12:02

cafeeee cafeeee在gmail.com
星期二 一月 15 12:02:09 HKT 2008

¶Ô£¬¾ÍÊÇÕâ¸öm={"a": 0, "b": 1, "c":None}

ÓÃexecÊÇ¿ÉÒԵģ¬¿ÉÊÇ¿´ÆðÀ´²»ÄÇôÊæ·þ£¬ÓÐûÓиüÓÅÑŵķ½·¨£¿
ÊDz»ÊÇÓñհü¿ÉÒÔ½â¾öÕâ¸öÎÊÌ⣿


2008/1/15 Jiahua Huang <jhuangjiahua在gmail.com>:

> ²»ÖªµÀÄã˵µÄ dict("a": 0, "b": 1, "c":None) ÊÇʲôÍæÒ⣬
> ²Â²âÄãÏë˵ dict(a=0, b=1, c=None) »ò {"a": 0, "b": 1, "c":None}
>
> >>> m=dict(a=0, b=1, c=None)
> >>> for k,v in m.items():
> ...     exec('def %s(): return s(%s)'%(k,v))
> ...
>
> 2008/1/15 cafeeee <cafeeee在gmail.com>:
> > Èç¹ûÏë¸ù¾Ýijm=dict("a": 0, "b": 1, "c":None)¶¯Ì¬Éú³ÉÈçϼ¸¸öº¯Êý£¬Ó¦¸ÃÔõô×ö£¿
> > def a():
> >     return s(0)
> >
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20080115/4525a82a/attachment.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2008年01月15日 星期二 12:34

shhgs shhgs.efhilt在gmail.com
星期二 一月 15 12:34:48 HKT 2008

不要用eval, exec。那是下三褴的Perl的方法。Python有更优雅的解决方案。

----------------------
class DynaFunc(object) :
    def __init__(self, d) :
        self.d = d
    def __getattr__(self, val) :
        if not val in self.d :
            raise NotImplementedError
        else :
            return lambda : s(d[val])

----------------------

2008/1/14 cafeeee <cafeeee在gmail.com>:
> 对,就是这个m={"a": 0, "b": 1, "c":None}
>
> 用exec是可以的,可是看起来不那么舒服,有没有更优雅的方法?
> 是不是用闭包可以解决这个问题?
>
>
> 2008/1/15 Jiahua Huang < jhuangjiahua在gmail.com>:
>
>
> > 不知道你说的 dict("a": 0, "b": 1, "c":None) 是什么玩意,
> > 猜测你想说 dict(a=0, b=1, c=None) 或 {"a": 0, "b": 1, "c":None}
> >
> >
> > >>> m=dict(a=0, b=1, c=None)
> > >>> for k,v in m.items():
> > ...     exec('def %s(): return s(%s)'%(k,v))
> > ...
> >
> > 2008/1/15 cafeeee <cafeeee在gmail.com>:
> >
> > > 如果想根据某m=dict("a": 0, "b": 1, "c":None)动态生成如下几个函数,应该怎么做?
> > > def a():
> > >     return s(0)
> > >
> > _______________________________________________
> > python-chinese
> > Post: send python-chinese在lists.python.cn
> > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> > Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2008年01月15日 星期二 12:36

Qiangning Hong hongqn在gmail.com
星期二 一月 15 12:36:11 HKT 2008

2008/1/15 cafeeee <cafeeee在gmail.com>:
> 对,就是这个m={"a": 0, "b": 1, "c":None}
>
> 用exec是可以的,可是看起来不那么舒服,有没有更优雅的方法?
> 是不是用闭包可以解决这个问题?

for k, v in m.iteritems():
    locals()[k] = lambda: s(v)

用闭包替换lambda应该也可以

-- 
Qiangning Hong
http://www.douban.com/people/hongqn/

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2008年01月15日 星期二 12:36

shhgs shhgs.efhilt在gmail.com
星期二 一月 15 12:36:40 HKT 2008

更正一下,有一个typo

           return lambda : s(d[val])

应该是

           return lambda : s(self.d[val])


2008/1/14 shhgs <shhgs.efhilt在gmail.com>:
> 不要用eval, exec。那是下三褴的Perl的方法。Python有更优雅的解决方案。
>
> ----------------------
> class DynaFunc(object) :
>     def __init__(self, d) :
>         self.d = d
>     def __getattr__(self, val) :
>         if not val in self.d :
>             raise NotImplementedError
>         else :
>             return lambda : s(d[val])
>
> ----------------------
>
> 2008/1/14 cafeeee <cafeeee在gmail.com>:
>
> > 对,就是这个m={"a": 0, "b": 1, "c":None}
> >
> > 用exec是可以的,可是看起来不那么舒服,有没有更优雅的方法?
> > 是不是用闭包可以解决这个问题?
> >
> >
> > 2008/1/15 Jiahua Huang < jhuangjiahua在gmail.com>:
> >
> >
> > > 不知道你说的 dict("a": 0, "b": 1, "c":None) 是什么玩意,
> > > 猜测你想说 dict(a=0, b=1, c=None) 或 {"a": 0, "b": 1, "c":None}
> > >
> > >
> > > >>> m=dict(a=0, b=1, c=None)
> > > >>> for k,v in m.items():
> > > ...     exec('def %s(): return s(%s)'%(k,v))
> > > ...
> > >
> > > 2008/1/15 cafeeee <cafeeee在gmail.com>:
> > >
> > > > 如果想根据某m=dict("a": 0, "b": 1, "c":None)动态生成如下几个函数,应该怎么做?
> > > > def a():
> > > >     return s(0)
> > > >
> > > _______________________________________________
> > > python-chinese
> > > Post: send python-chinese在lists.python.cn
> > > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> > > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> >
> >
> > _______________________________________________
> > python-chinese
> > Post: send python-chinese在lists.python.cn
> > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> >
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2008年01月15日 星期二 12:39

Jiahua Huang jhuangjiahua在gmail.com
星期二 一月 15 12:39:53 HKT 2008

倒,

那么 locales() 版本、globals() 版本、 __dict__ 版本都可以弄出一堆来了

2008/1/15 shhgs <shhgs.efhilt at gmail.com>:
> 不要用eval, exec。那是下三褴的Perl的方法。Python有更优雅的解决方案。
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2008年01月15日 星期二 14:00

cafeeee cafeeee在gmail.com
星期二 一月 15 14:00:45 HKT 2008

ÕâÖÖ·½·¨ºÃÏñ²»ÐУº

>>> def s(p): print p
...
>>> m={"a":0, "b":1, "c":None}
>>> for k,v in m.iteritems():
...     locals()[k] = lambda: s(v)
...
>>> a()
1
>>> b()
1
>>> c()
1
>>>


2008/1/15 Qiangning Hong <hongqn在gmail.com>:

>
> for k, v in m.iteritems():
>    locals()[k] = lambda: s(v)
>
> ÓñհüÌæ»»lambdaÓ¦¸ÃÒ²¿ÉÒÔ
>
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20080115/a9c48941/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]
zy

zy

2008年01月15日 星期二 18:44

Lich_Ray solo.lich在gmail.com
星期二 一月 15 18:44:32 HKT 2008

python 3.0 À´ºóËùÓÐÓÐϱêµÄÀàÐͶ¼¿ÉÒÔÖ±½ÓʹÓú¯Êýµ÷ÓÃÓï·¨·ÃÎÊ£¬Õâ¸öÎÊÌâ¾Í²»´æÔÚÁË¡£ËµÊµ»°£¬3.0µÄ´ó¶àÊý¸Ä±äÎÒ¶¼±È½ÏÌÖÑᣬ³ýÁËÕâ¸ö»¹ÓÐlambdaµÄÔöÇ¿¡¢ÁбíģʽƥÅä¡£

ÔÚ08-1-15£¬cafeeee <cafeeee在gmail.com> дµÀ£º
>
> ÓÐÈçÏÂÒ»¸öº¯Êý£º
>
> def s(param):
>    # ...
>    # ...
>
> Èç¹ûÏë¸ù¾Ýijm=dict("a": 0, "b": 1, "c":None)¶¯Ì¬Éú³ÉÈçϼ¸¸öº¯Êý£¬Ó¦¸ÃÔõô×ö£¿
> def a():
>    return s(0)
>
> def b():
>    return s(1)
>
> def c():
>    return s(None)
>
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>



-- 
Ray Stinger, nickname Lich_Ray
God is in his heaven, all's right with the world.
-------------------------------------------------
let focus = 'computing' in where:
http://lichray.javaeye.com
let focus = 'computing' in here:
http://lichray.bokeland.com
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20080115/abbf0ffe/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2008年01月15日 星期二 23:36

Qiangning Hong hongqn在gmail.com
星期二 一月 15 23:36:28 HKT 2008

2008/1/15 cafeeee <cafeeee在gmail.com>:
> 这种方法好像不行:

那试试这个:

from functools import partial

for k, v in m.items():
    locals()[k] = partial(s, v)

-- 
Qiangning Hong
http://www.douban.com/people/hongqn/

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2008年01月16日 星期三 15:30

cafeeee cafeeee在gmail.com
星期三 一月 16 15:30:56 HKT 2008

Óñհü¿ÉÒÔ½â¾öÕâ¸öÎÊÌ⣺

>>> def s(param): print param
...
>>> m={"a":1, "b":2, "c": None}
>>> for k,v in m.items():
...     def ss(param=v): s(param)
...     locals()[k] = ss
...
>>> a()
1
>>> b()
2
>>> c()
None
>>>
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20080116/dcfbc864/attachment-0001.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号