凑合解决 lambda 里的多行语句和 print

155 views
Skip to first unread message

Jiahua Huang

unread,
Jun 21, 2009, 11:41:29 AM6/21/09
to python-cn
多说无益,

>>> import sys
>>> myprint = lambda i: sys.stdout.write(str(i) + '\n')
>>> foo = lambda i: not not (
... myprint(i),
... myprint(i+1),
... myprint(i+2),
... myprint(i+3),
... )
>>> foo(1)
1
2
3
4
True

Jiahua Huang

unread,
Jun 21, 2009, 11:50:04 AM6/21/09
to python-cn
嗯,缘由是为了让 gjots 等纯 PyGtk 程序支持 Undo/Redo 操作,

0. GtkTextView 默认不支持 Undo/Redo 操作,编辑区写错了很麻烦。
1. 不想再写 UndoBuffer ,于是简单用 GtkSourceView 代替 GtkTextView,
2. 为了编辑区切换文章后能处理好 UndoStack,需要处理 .set_text()
3. 为了不派生新类和嵌套函数,希望多个动作能放在一个 lambda 里
于是就凑合了个伪多行 lambda
4. 同时希望不修改旧的 glade 文件
于是就搬出了 override


过程见附件 gjots2 补丁

2009/6/21 Jiahua Huang <jhuang...@gmail.com>:
> 多说无益,
>

gjots2-undo-support.patch

Zoom.Quiet

unread,
Jun 21, 2009, 11:50:25 AM6/21/09
to pyth...@googlegroups.com
2009/6/21 Jiahua Huang <jhuang...@gmail.com>:

太宅了,,,,什么情况下需要用此技?

--
http://zoomquiet.org
'''过程改进乃是催生可促生靠谱的人的组织!'''
一个人如果力求完善自己,就会看到:为此也必须同时完善他人. 一个人如果不关心别人的完善,自己便不可能完善!

Zoom.Quiet

unread,
Jun 21, 2009, 12:00:08 PM6/21/09
to pyth...@googlegroups.com
2009/6/21 Jiahua Huang <jhuang...@gmail.com>:

> 嗯,缘由是为了让 gjots 等纯 PyGtk 程序支持 Undo/Redo 操作,
>
这个,应该有更加KISS 的作法哪?
仿制 网页的Cookie ? 将操作序列记录到栈中就好的吧?
这种暗技,比较容易出问题的吧...

> 0. GtkTextView 默认不支持 Undo/Redo 操作,编辑区写错了很麻烦。
> 1. 不想再写 UndoBuffer ,于是简单用 GtkSourceView 代替 GtkTextView,
> 2. 为了编辑区切换文章后能处理好 UndoStack,需要处理 .set_text()
> 3. 为了不派生新类和嵌套函数,希望多个动作能放在一个 lambda 里
>    于是就凑合了个伪多行 lambda
> 4. 同时希望不修改旧的 glade 文件
>    于是就搬出了 override
>
>
> 过程见附件 gjots2 补丁
>
> 2009/6/21 Jiahua Huang <jhuang...@gmail.com>:
>> 多说无益,

--
http://zoomquiet.org
'''过程改进乃是催生可促生靠谱的人的组织!'''
Time is unimportant, only life important!

Zoom.Quiet

unread,
Jun 21, 2009, 12:04:58 PM6/21/09
to pyth...@googlegroups.com
2009/6/22 Zoom.Quiet <zoom....@gmail.com>:

> 2009/6/21 Jiahua Huang <jhuang...@gmail.com>:
>> 嗯,缘由是为了让 gjots 等纯 PyGtk 程序支持 Undo/Redo 操作,
>>
收录!
http://wiki.woodpecker.org.cn/moin/MiscItems/2009-06-22

不论多么特殊的场景, Pythonic 都可以放光!

> 这个,应该有更加KISS 的作法哪?
> 仿制 网页的Cookie ? 将操作序列记录到栈中就好的吧?
> 这种暗技,比较容易出问题的吧...
>
>> 0. GtkTextView 默认不支持 Undo/Redo 操作,编辑区写错了很麻烦。
>> 1. 不想再写 UndoBuffer ,于是简单用 GtkSourceView 代替 GtkTextView,
>> 2. 为了编辑区切换文章后能处理好 UndoStack,需要处理 .set_text()
>> 3. 为了不派生新类和嵌套函数,希望多个动作能放在一个 lambda 里
>>    于是就凑合了个伪多行 lambda
>> 4. 同时希望不修改旧的 glade 文件
>>    于是就搬出了 override
>>
>>
>> 过程见附件 gjots2 补丁
>>
>> 2009/6/21 Jiahua Huang <jhuang...@gmail.com>:
>>> 多说无益,

--
http://zoomquiet.org
'''过程改进乃是催生可促生靠谱的人的组织!'''
PE keeps evolving organizations which promoting people be good!

Jiahua Huang

unread,
Jun 21, 2009, 12:09:26 PM6/21/09
to pyth...@googlegroups.com
2009/6/22 Zoom.Quiet <zoom....@gmail.com>:
> 这个,应该有更加KISS 的作法哪?

大妈啊,除掉 lambda,其他都 kiss 呀~


让 Gtk 程序的文本编辑区(GtkTextView)支持 Undo/Redo 基本上就是两个做法:

1. 自己写 UndoBuffer 或通过其他机制,用一个 UndoStack 来记录编辑操作

2. 省事点就直接用 GtkSourceView 代替 GtkTextView,
GtkSourceView 是 Gnome 的代码编辑控件,用法兼容 GtkTextView,但是增加了 Undo/Redo 和语法高亮等特性


所以比较起来, 我用的方法还是相对较 Kiss 的~

只是为了不用派生新类,直接利用 python 的动态特性修改类实例的方法
(即那个 self.textBuffer.set_text)
而 lambda 只是为了修改方法不用定义新函数~

Luo, Yong

unread,
Jun 21, 2009, 8:51:49 PM6/21/09
to pyth...@googlegroups.com

Factory方法

Zoom.Quiet

unread,
Jun 21, 2009, 9:04:18 PM6/21/09
to pyth...@googlegroups.com
2009/6/22 Jiahua Huang <jhuang...@gmail.com>:

> 让 Gtk 程序的文本编辑区(GtkTextView)支持 Undo/Redo 基本上就是两个做法:
>
> 1. 自己写 UndoBuffer 或通过其他机制,用一个 UndoStack 来记录编辑操作
>
> 2. 省事点就直接用 GtkSourceView 代替 GtkTextView,
>    GtkSourceView 是 Gnome 的代码编辑控件,用法兼容 GtkTextView,但是增加了 Undo/Redo 和语法高亮等特性
>
>
> 所以比较起来, 我用的方法还是相对较 Kiss 的~
>
> 只是为了不用派生新类,直接利用 python 的动态特性修改类实例的方法
> (即那个 self.textBuffer.set_text)
> 而 lambda 只是为了修改方法不用定义新函数~

理由和评估都很充分,增补到:
http://wiki.woodpecker.org.cn/moin/MiscItems/2009-06-22

不过,既然有了专门的支持 `GtkSourceView` 不用的话,有些亏...

当然当前的HACK 兼容性,维护性都还好,提醒关注是否有其它问题
- 其实就是 内嵌式函式了 ;-)

Qiangning Hong

unread,
Jun 21, 2009, 11:19:25 PM6/21/09
to pyth...@googlegroups.com
2009/6/21 Jiahua Huang <jhuang...@gmail.com>:
foo = lambda i: (myprint(i), myprint(i+1), myprint(i+2), myprint(i+3),) and None

这样foo(1)的返回值是None,更加像一个普通函数调用 :)

>
> >
>



--
Qiangning Hong

Zoom.Quiet

unread,
Jun 21, 2009, 11:23:41 PM6/21/09
to pyth...@googlegroups.com
2009/6/22 Qiangning Hong <hon...@gmail.com>:

增补到:
http://wiki.woodpecker.org.cn/moin/MiscItems/2009-06-22

怪不得 AlbertLee 介绍 Haskell 时说,这是一个不用单元测试的语言;-)
FP 化的部分,只要确保是 纯函式,就可以充分信任 ;-)

--
http://zoomquiet.org
'''过程改进乃是催生可促生靠谱的人的组织!'''
Usage OOo to replace M$ Office; You can get the truely Freedom 4 software.

Jiahua Huang

unread,
Jun 22, 2009, 12:51:52 AM6/22/09
to pyth...@googlegroups.com
2009/6/22 Qiangning Hong <hon...@gmail.com>:

> foo = lambda i: (myprint(i), myprint(i+1), myprint(i+2), myprint(i+3),) and None
>
> 这样foo(1)的返回值是None,更加像一个普通函数调用 :)
>

赞 Hong 总~

周济是母驴

unread,
Jun 22, 2009, 3:17:53 AM6/22/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
not not 可以改成 all

from __future__ import print_function

foo = lambda x: all([
print(x),
print(x+1),
print(x+2),
print(x+3),
])

foo(1)

J

unread,
Jun 22, 2009, 11:30:37 PM6/22/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
又找到个用3k的理由?
Reply all
Reply to author
Forward
0 new messages