pokemonlei

陈磊的博客 | pokemonlei

python闭包

前言

其实闭包是一个很简单的概念,不只是在python中有,所有把函数做为一等公民的语言均有闭包的概念。不过像Java这样以class为一等公民的语言中也可以使用闭包,只是它得用类或接口来实现。

虽然概念简单,但用处强大,然而这个概念却经常忘记,本着好记性不如烂笔头的想法,在这里大体概括一下闭包的基本概念,加强记忆。

什么是闭包?

维基上的解释是:在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。

简而言之:就是函数里嵌套一个内部函数,内部函数用到了外边函数中的变量,此时内部函数和用到的外部变量组成了一块空间,这块整体空间就叫闭包。而由于在python中,函数是第一类对象可以当作返回值返回,所以这个闭包也可以当作变量传递

上代码:

1
2
3
4
5
6
7
8
def func(myname):
def inner_func(hername):
print(myname, ' and ', hername)
return inner_func

withwho = func('pokemonlei')
withwho('qq') # >>> pokemonlei and qq

闭包有什么用?

  • 返回一个函数然后延迟执行
  • 封装一个私有变量
  • 用来实现python的装饰器等

Scaleform中的IME适配win10

The Scaleform IME solution allows game players to easily switch input languages and type in Asian characters allowing them to chat in a multi-lingual way while playing games.

官方文档地址:http://help.autodesk.com/view/SCLFRM/ENU/?guid=__scaleform_help_ime_html

近期端游中用到了scaleform的IME,但在win7系统上正常的功能在win10上就有问题。

问题1:显示不出候选框列表 candidate list以及reading window,并且对win10自带的输入法不生效

win7上有候选框而win10没有,是因为win7和win10的读取路径不一样,以Cry为例:

如图,win7中,如果在第三个参数传入的是imeXmlFile,则win7上是好用的,而win10不好用,因为win10默认已经在Libs/UI文件夹下了。

而至于微软默认输入法无法适配,是因为在scaleform4.5中,认为windows中默认的微软输入法名字都是英文,而win10则很良心的把输入法名字都改为了中文,这时候就读取不到了,所以组件中的ime.xml里需要添加对中文名字的解析,这里对于win10中的默认输入法我给设置成了Microsoft Pinyin IME 2010一样的配置,如下图:

设置完ime.xml后,还需要更改GFx_IMEIdMap.cpp中的读取支持:

添加如图中的两行解析,这个文件里是不支持中文的,所以都是把中文字符串转换为了16进制,也就是所看到的的 \xE5\xBE 等。

问题2:输入了一些文字后,在 reading window状态下按回退键,会导致 reading window所有的字母都消失掉,但candidate list确是正常的

原因:光标问题

如上面两张图,在Text_EditorKit中响应了KeyAct_Backspace消息后,由于是不选中文字状态,所以beginSel==endSel,这时候会通过Cmd_BackspaceChar走到Text_DocView里,而传进来的参数newPos就是光标所在位置,在Text_DocView里会通过RemoveText(开始位置,结束位置)来删除传进来光标位置的前一个字符,res返回值表示新光标移动的位置。
这时候传入的newPos其实是没有加上reading window中的字符的,所以会导致按一下回退,所有reading window中的字符全部消失并且已经输入好的一个字符也消失掉。

改动方法为我们这里手动更改光标的位置,即:

这里将newPos加上了一个reading window的长度,之后的SetCursorPos(newPos)会将光标设置到一个正确的位置。而SetCursorPos中有做判断不会将设置的位置超过已经输入的文本长度,所以这里也要在给它加上一个reading window的长度。

另外有时候会遇到崩溃问题,这里需要做一个判空:

问题3:candidate list为空白,什么都看不到,但是可以通过数字键来选择不同的候选词

原因:可以通过鼠标来选择,并且显示空白,说明其实是有出现candidate list的,只是颜色设置不对。
这里不知道是使用不正确还是确实有这个问题,反正我这里是遇到了。
大概就是其他地方调用了InitCandidateListDefaults传入了一个styles,但是这个传入的值还不是undefined,是全部颜色都是白色,大概是默认的?
修改如下:这里比较暴力,直接修改为了自己需要的颜色,有需要的话可以通过调用SetCandidateListProps再修改或者直接调用InitCandidateListDefaults的时候传入一个自己设置的对的

新博客迁移中

###新的博客搞完了,用了入宅作《灼眼的夏娜》作为主题。电脑端右键或手机长按可以呼出GalMenu
这段时间脑子有点抽风,给自己找个新的目标。