那简单说一下。。。6L主要利用字典的dict(iterable)创建方式,这种方式必须保证迭代元素是键值对,因此先回答以下两个问题。
----------------------------
我注意到你代码里面的形式是每个键后面的值的数量递增了1,你说的这个要满足这种形式么~
>> 只要满足键名不重复即可,键名重复虽不会报错,但会让你头疼。
还是只要键后面的值用括号括起来了就行了?
>> 后面的值只能有一个,不然就不是键值“对”了
----------------------------
继续回到6L代码,这种方式利用一个事实,"key, value"字符串通过eval求值可以得到(key, value)元祖。但是这里有两个问题:
1. 我们需要的是('key', 'value')。
2. eval对key或value求值时,命名空间内没有相应名字存在时会发生NameError。
继续话题前,请首先保证你对命名空间和LEGB法则有正确理解。
6L的seval就是在NameError发生时,在函数作用域内用exec执行key='key',让对key求值可以从函数命名空间内得到'key'。当然,这个seval有以下注意点以及缺陷。
1. seval用函数属性来做返回值是为了不添加局部变量污染命名空间。
2. seval尽量放在单独一个模块(文件)内,以减少模块顶层名字的干扰。
3. 如果求值字符串内有内置名字(模块内置、list、set等)时,此方法不适用。
大致就是这些,继续搬砖去了