知乎:https://www.zhihu.com/people/monkey.d.luffy Android高级开发交流群2: 752871516
全部博文(315)
分类: Python/Ruby
2012-02-22 21:40:15
14/1 if __name__ == ‘__main__’ 语句
以前只是跟着写,说是只有这个模块作为文件运行的时候才会执行这个if 包裹的内容,不然只是作为模块使用。(下面解释貌似也是差不多,所以我们在作为模块导入到其他文件的时候,如果某些函数根本不会用到,那么我们可以将其缩进然后放到该if语句的下面,”隐藏起来“,避免多次被run)
跟着应该是一个 if 语句,它通过检测__name__来确定是否要调用脚本,比如,“if__name__ == '__main__'”。如果相等的话,你的脚本会执行 main 内代码;否则只是打算导入这个脚本,那么可以在这个模块内对代码进行测试。
14/2 执行东东
Command:
>>> eval_code = compile('1+2', '', 'eval')
>>> eval(eval_code)
3
>>> single_code = compile('print "hello world!"', '', 'single')
>>> exec single_code
hello world!
>>> import os
>>> f = os.popen('uname -a')
>>> data = f.readline()
>>> f.close()
>>> print data
Linux ubuntu 2.6.32-30-generic #59-Ubuntu SMP Tue Mar 1 21:30:21 UTC 2011 i686 GNU/Linux
>>> f = Popen('who', stdout=PIPE).stdout
>>> data = [ eachLine.strip() for eachLine in f ]
>>> f.close()
>>> for eachLine in data:
... print eachLine
...
huanglei tty7 2012-01-25 01:48 (:0)
huanglei pts/0 2012-01-25 02:16 (:0.0)
File:
>>> f = open('xcount.py')
>>> exec f
x is currently: 0
increamenting x to: 1
increamenting x to: 2
increamenting x to: 3
increamenting x to: 4
increamenting x to: 5
上面课本的实例都练习了,还是能看懂的;下面对稍微复杂的进行下分析,看能不能学习点东西。
14.3.6 使用 Python 在运行时生成和执行 Python 代码
-------在运行时生成和执行 Python 代码
第一个例子是 loopmake.py 脚本,一个简单的、迅速生成和执行循环的计算机辅助软件工程(CASE)。它提示用户给出各种参数(比如,循环类型(while 或 for), 迭代的数据类型[数字或序列]),生成代码字串,并执行它。
Example 14.1 动态生成和执行 Python 代码
(loopmake.py)
代码算是调完了,在凑那个可执行代码字典的时候,需要注意缩进问题,代码第一行千万要顶格写,不然编译通过不,作为结尾的”””这个三个引号需要顶格,不然报错,我都试了很多缩进,要注意了。(对于这种生成代码的方式,确实很少见,学习自动生成Makefile的时候,知道有专门的工具可以生成,你只需要修改配置文件啊,创建配置文件啊,但是python这种没见过:就是通过占位符的操作,替换自己需要的变量符号,只需要把你的所有用到的变量都写入一个元组里面就好了,还是可以理解的!!)
分析下这个代码吧:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
dashes = '\n' + '-' * 50 #50个'-'号(开头换行)
#构造一个存储代码的字典(不同的键对应不同的代码),里面变量均用占位符,注意缩进
exec_dict = {
'f': """ #for loop
for %s in %s:
print %s
""",
's': """ #sequence while loop
%s = 0
%s = %s
while %s < len(%s):
print %s[%s]
%s = %s + 1
""",
'n': """ #count while loop
%s = %d
while %s < %d
print %s
%s = %s + %d
"""
}
def main():
#以下是输入用户选择的循环方式(for or while),以及操作的数据类型(数字或者序列)
ltype = raw_input('Loop type? (For/While) ')
dtype = raw_input('Data type? (Number/Seq) ')
if dtype == 'n': #表示选择数字方式
start = input('Starting value? ')
stop = input('Ending value (non-inclusive)? ')
step = input('Stepping value? ')
seq = str(range(start, stop, step)) #产生数字序列
else:
seq = raw_input('Enter sequence: ') #表示选择序列方式(需要输入序列)
var = raw_input('Iterative varible name? ') #输入用于循环的变量名称
if ltype == 'f': #如果是for循环,则按照如下方式产生代码
#这种方式没见过,给字典赋值,该复习字典了
exec_str = exec_dict['f'] % (var, seq, var) #变量依次替换占位符,直到用完
elif ltype == 'w': #如果是while循环,则需要区分是哪种数据类型:如果是序列,我们需要提供一个序列的名称(因为while循环用到了len()来求序列长度,所以名字就必须了),否则就不用了
if dtype == 's':
svar = raw_input('Enter sequence name? ')
exec_str = exec_dict['s'] % (var, svar, seq,\
var, svar, svar, var, var, var)
elif dtype == 'n':
exec_str = exec_dict['n'] % (var, start, var,\
stop, var, var, var, step)
#下面就是相应的执行和测试
print dashes
print 'Your custom-generated code: ' + dashes
print exec_str + dashes
print 'Test execution of the code:' + dashes
exec exec_str
print dashes
if __name__ == "__main__":
main()
执行效果测试了,准确!
huanglei@ubuntu:~/python/exec$ python loopmake.py
Loop type? (For/While) f
Data type? (Number/Seq) n
Starting value? 0
Ending value (non-inclusive)? 3
Stepping value? 1
Iterative varible name? countger
--------------------------------------------------
Your custom-generated code:
--------------------------------------------------
#for loop
for countger in [0, 1, 2]:
print countger
--------------------------------------------------
Test execution of the code:
--------------------------------------------------
0
1
2
--------------------------------------------------
-------有条件地执行代码
第二个例子着重描写了在第 11 章"函数"引入的函数属性,它是从 Python 增强提议 232 PEP 232)(中的例子得到的灵感。假设你是一位负责质量控制的软件开发者,你鼓励你的工程师将回归测试或回归指令代码放到主代码中,但又不想让测试代码混合到产品代码中。你可以让工程师创建字符串形式的测试代码。当你的测试框架执行的时候,它会检测函数是否定义了测试体,如果是的话,(求值并)执行它。如果不是,便跳过,像通常一样执行。
Example 14.2
Function Attributes (funcAttrs.py)
调用 sys.exit()使 python 解释器退出。exit()的任何整数参数作为退出状态会返回给调用者,该值默认为 0
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
def foo():
return True
def bar():
'bar() does not do much' #文档字符串的一种形式
return True
foo.__doc__ = 'foo() does not do much' #文档字符串的另一种设置方式
foo.tester = '''
if foo():
print 'PASSED'
else:
print 'FAILED'
'''
for eachAttr in dir():
obj = eval(eachAttr)
if isinstance(obj, type(foo)): #过滤所有的非函数对象, 这里我们借用type来获取foo的属性(其实就是函数),然后拿从dir()中读取的属性来对比看是否一致,到达过滤要求,当然foo可以替换为bar或者任意函数
if hasattr(obj, '__doc__'):
print '\nFunction "%s" has a doc string:\n\t \
%s' % (eachAttr, obj.__doc__)
if hasattr(obj, 'tester'): #如果存在tester(单元测试..)
print 'Function "%s" has a tester...excuting' % \
eachAttr
exec obj.tester
else:
print 'Function "%s" has no tester... skipping'% \
eachAttr
else:
print '"%s" is not a function' % eachAttr
huanglei@ubuntu:~/python/exec$ python funcAttrs.py
"__builtins__" is not a function
"__doc__" is not a function
"__file__" is not a function
"__name__" is not a function
"__package__" is not a function
Function "bar" has a doc string:
bar() does not do much
Function "bar" has no tester... skipping
Function "foo" has a doc string:
foo() does not do much
Function "foo" has a tester...excuting
PASSED
感言:其实发现自己学习python也学的不怎地,学的好的话,就该知道如何运用,深刻理解工作机制,这才能利用它来替你干活啊…….自己的耐心太差
我在创建python文件的时候用到了自己以前琢磨的一个document_hens项目的doc –py test.py的命令,这是以前无聊用c写的文档管理的,觉得挺实用;主要就是以前在查看自己硬盘的电影的时候,发现好多电影都整一块,突然想每个电影给整个文件夹,这样看起来舒服多了,就想到去搞个这个小项目,后来可以生成项目文档的诸多文件(像项目规划,详细设计啊),可以生成python文件模块,管理c,c++文件,后来还想着去添加一个自动生成Makefile的功能(滞后了),可以增加其他文档管理,视频管理啊功能,其实这个就是字符串拆分啊,然后调用exec,system等来实现的,只需要自己创建一类文件的标准模版,然后每次生成需要的文件就调用相应文件模版来生成文件,可以省去你编写很多文件注释符,环境字符串,文件信息啊等等信息…以后再完善那个项目,应该加入python去管理,估计更高效和节省代码….又扯蛋了…哈哈哈哈