zoukankan      html  css  js  c++  java
  • 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)

    水平有限, 欢迎拍砖!

  • 相关阅读:
    使用secureCRT连接VMware-Ubuntukylin虚拟机
    java使用POI jar包读写xls文件
    SimpleDateFormat 相关用法
    ORACLE之表
    ORACLE之PACKAGE-游标变量
    PHP多进程学习(三)__代码案例来了解父进程与子进程的执行顺序
    PHP多进程学习(二)__fork起多个子进程,父进程的阻塞与非阻塞
    PHP多进程学习(二)__来初步了解一下PHP多进程及简单demo
    Python学习【三】
    Python学习【二】
  • 原文地址:https://www.cnblogs.com/icejoywoo/p/3526152.html
Copyright © 2011-2022 走看看