Python tricks(1) -- 动态定义一个新变量
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) -- 动态定义一个新变量的更多相关文章
- CREATE FUNCTION - 定义一个新函数
SYNOPSIS CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] ) RETURNS rettype { LANGUAGE lang ...
- CREATE AGGREGATE - 定义一个新的聚集函数
SYNOPSIS CREATE AGGREGATE name ( BASETYPE = input_data_type, SFUNC = sfunc, STYPE = state_data_type ...
- Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法EDIT Object.defineProperty(obj, ...
- C语言定义一个指针变量
10.2.1 定义一个指针变量 对指针变量的定义包括三个内容: (1) 指针类型说明,即定义变量为一个指针变量: (2) 指针变量名: (3) 变量值(指针)所指向的变量的数据类型. 其一般形式为: ...
- CREATE OPERATOR CLASS - 定义一个新的操作符类
SYNOPSIS CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type USING index_method AS { OPERATOR ...
- CREATE OPERATOR - 定义一个新的操作符
SYNOPSIS CREATE OPERATOR name ( PROCEDURE = funcname [, LEFTARG = lefttype ] [, RIGHTARG = righttype ...
- 第8.20节 Python中限制动态定义实例属性的白名单:__slots__
一. 引言 按照<第7.10节 Python类中的实例变量定义与使用>.<第7.14节Python类中的实例方法解析>中的介绍,当定义了一个类,并且创建了该类的实例后,可以给该 ...
- 如何用python的装饰器定义一个像C++一样的强类型函数
Python作为一个动态的脚本语言,其函数在定义时是不需要指出参数的类型,也不需要指出函数是否有返回值.本文将介绍如何使用python的装饰器来定义一个像C++那样的强类型函数.接下去,先介绍 ...
- CREATE TABLE - 定义一个新表
SYNOPSIS CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( { column_name data_ty ...
随机推荐
- Linux hwclock 命令
hwclock 即 Hardware Clock 硬件时钟,该命令用于查询或设置硬件时钟:硬件时钟是指主机板上的时钟设备,也就是通常可在 BIOS 画面设定的时钟:系统时钟是指 Kernel 中的时钟 ...
- C语言编程基础学习字符型数据的ASCII码值为何是负数?
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- Python查询数据库时候遇到的乱码问题
今天在看Python连接数据库的内容,然后遇到了最常遇到的字符乱码的状况,这真的很烦人,由于我用的是3.6的版本,,默认的是utf-8,如果是3以下的版本,请在文件开头加一句代码 #encoding= ...
- c语言基础知识要点
C语言程序的构成 与C++.Java相比,C语言其实很简单,但却非常重要.因为它是C++.Java的基础.不把C语言基础打扎实,很难成为程序员高手. 一.C语言的结构 先通过一个简单的例子,把C语言的 ...
- Spring学习笔记--声明一个简单的Bean
spring依赖的maven dependencyhttp://mvnrepository.com/artifact/org.springframework 在pom.xml中添加如下依赖: < ...
- PyQt4颜色对话框QColorDialog
QColorDialog提供了用于显示颜色的对话框. #!/usr/bin/python # -*- coding: utf-8 -*- import sys from PyQt4 import Qt ...
- PHP的函数-----生成随机数、日期时间函数
常用的函数 [1] 生成随机数 rand(); 例子: echo rand(); 显示结果: 当刷新时,会有不同的数,默认生成随机数.生成随机数不能控制范围. 如果,想要控制在范围之内,就用: e ...
- 【ecshop】使用sql 清除测试数据
操作方式:后台->数据库->sql查询 输入以下你想进行的操作 -- -- 清空会员有关数据: -- TRUNCATE TABLE `ecs_users` ; TRUNCATE TAB ...
- [转]C++结构体|类 内存对齐详解
内存地址对齐,是一种在计算机内存中排列数据(表现为变量的地址).访问数据(表现为CPU读取数据)的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐 . 为什么需要内存对齐?对 ...
- Cloud Foundry技术全貌及核心组件分析
原文链接:http://www.programmer.com.cn/14472/ 历经一年多的发展,Cloud Foundry的架构设计和实现有了众多改进和优化.为了便于大家了解和深入研究首个开源Pa ...