python是动态语言, 无需声明变量即可使用.

传递一个tuple, list或者dict等等方式, 有时候这种方式的使用不是很好.

对于tuple和list来说都是用下标的访问方式(即使用[]), 这种方式显得不够自然, 阅读代码的时候需要知道index对应的变量含义.

其实, 在python中有很多方式可以动态定义一个新变量, 让代码更具可读性.

动态定义一个新变量, 最简单的方式是使用locals()或者globals(), 两个方法的返回值是dict, 可以通过修改dict来增加新变量.

locals()["aa"] = "locals_aa"
print aa globals()["bb"] = "global_bb"
print bb

代码看起来略显得诡异把. 我们如何在一个module中动态定义一个新变量.

先来获取this_module这个变量.

import sys
this_module = sys.modules[__name__]

获得this_module之后就可以通过this_module.new_var=blahblah来动态定义一个新变量了.

this_module.a = 10
print dir(this_module)
print a

上面的方式定义了一个a的新变量, 上面的调用方法类似于this_module.__dict__["a"] = 10.

动态定义一个变量在什么时候有用呢? 具一个pyh库的例子吧(这个库的html标签不是很全, 可以修改tags变量来增加没有的标签).

代码路径: https://code.google.com/p/pyh/source/browse/trunk/pyh.py

thisModule = modules[__name__]
for t in tags: setattr(thisModule, t, TagFactory(t))

pyh使用这种方式为pyh module提供了所有tags的属性, 当然这里使用了setattr, 改成thisModule[t] = TagFactory(t)是一样的效果.

最后再扯一下python的collections.namedtuple方法.

tuple默认是用下标访问, 这个namedtuple还是tuple, 不过可以不用下标访问了.

from collections import namedtuple

# define a namedtuple type
t = namedtuple("t", "a b c")
x = t(1, 2, 3)
print x
print x[0], x.a
print x[1], x.b
print x[2], x.c

本文的实验环境: python 2.7.x(2.7.5)

水平有限, 欢迎拍砖!

Python tricks(1) -- 动态定义一个新变量的更多相关文章

  1. CREATE FUNCTION - 定义一个新函数

    SYNOPSIS CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] ) RETURNS rettype { LANGUAGE lang ...

  2. CREATE AGGREGATE - 定义一个新的聚集函数

    SYNOPSIS CREATE AGGREGATE name ( BASETYPE = input_data_type, SFUNC = sfunc, STYPE = state_data_type ...

  3. Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。

    Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法EDIT Object.defineProperty(obj, ...

  4. C语言定义一个指针变量

    10.2.1 定义一个指针变量 对指针变量的定义包括三个内容: (1) 指针类型说明,即定义变量为一个指针变量: (2) 指针变量名: (3) 变量值(指针)所指向的变量的数据类型. 其一般形式为: ...

  5. CREATE OPERATOR CLASS - 定义一个新的操作符类

    SYNOPSIS CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type USING index_method AS { OPERATOR ...

  6. CREATE OPERATOR - 定义一个新的操作符

    SYNOPSIS CREATE OPERATOR name ( PROCEDURE = funcname [, LEFTARG = lefttype ] [, RIGHTARG = righttype ...

  7. 第8.20节 Python中限制动态定义实例属性的白名单:__slots__

    一. 引言 按照<第7.10节 Python类中的实例变量定义与使用>.<第7.14节Python类中的实例方法解析>中的介绍,当定义了一个类,并且创建了该类的实例后,可以给该 ...

  8. 如何用python的装饰器定义一个像C++一样的强类型函数

        Python作为一个动态的脚本语言,其函数在定义时是不需要指出参数的类型,也不需要指出函数是否有返回值.本文将介绍如何使用python的装饰器来定义一个像C++那样的强类型函数.接下去,先介绍 ...

  9. CREATE TABLE - 定义一个新表

    SYNOPSIS CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( { column_name data_ty ...

随机推荐

  1. osgEarth使用没有DX的Triton库Triton-MT-DLL-NODX.lib

    将Triton-MT-DLL修改为Triton-MT-DLL-NODX

  2. Keil(MDK-ARM)在线调试(Ⅰ)(转)

    Ⅰ.写在前面 Keil在线调试的内容有很多,本文带来在线调试常用的内容:Debug Toolbar调试工具栏(复位.全速运行.停止运行.单步调试.逐行调试.跳出调试.运行到光标行.跳转到暂停行.调试窗 ...

  3. 【转】实现Ribbon风格的窗体

    随着office2007的兴起,微软让我们看到了Ribbon风格的窗体,现在很多软件也都开始使用Ribbon风格.那么我们如果要自己开发,应当怎么做呢?本文就是为大家解开这个疑团的. 首先,Delph ...

  4. JS-点和中括号

    今天上午做一个很low的小练习,代码写完了想要封装重复利用来着 可是憋屈啊,怎么都不对,在document.style.width这里,想把width变成参数可是用点的话,会报错说找不到点后边这个属性 ...

  5. fping命令测试主机存活

    author:headsen  chen date: 2018-10-09 20:11:22 1,测试一个范围内的主机: fping  -a  -g 192.168.1.1 192.168.1.255 ...

  6. Linux更换jdk版本,java -version还是原来的版本问题

    服务器上默认安装版本是: 使用jenkins最新的安装包 2.73.1,启动报错52.0!需要使用1.8进行启动. 两种方式,要么tomcat直接指定,要么修改环境变量,这里我使用修改安装java版本 ...

  7. C#读取xml文件指定节点下的值

    #region 读取xml文件指定节点下的值 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(result); XmlNode root ...

  8. 用Oracle实现ASH的数据透视图

    11g里面有个很有用的新特性,对数据透视图的支持. 简单而言,它可以实现宽表和窄表之间的转化.举一个例子,有一张表记录了全校所有班级所有学生的成绩(A,B,C,D,E),现在想统计每个班级里每个分数级 ...

  9. CentOS下LVM逻辑卷管理技术解释

    1.LVM逻辑卷管理技术产生的背景 企业日益变化的存储需要使得传统的磁盘分区存储显得不够灵活 2.磁盘分区存储 对于这样的三个物理分区的话,迟早有一天会被数据填满,因为它是死的,无法进行缩放. 假设下 ...

  10. collision weaknesses

    15.1. hashlib — Secure hashes and message digests — Python 3.5.6 documentation https://docs.python.o ...