我无法理解sys.stdout
和sys.stderr
问题是put变量是如何进入cmd模块的?我的目标是编写一个接受字符串的函数,基本上我用它将应用程序中捕获的异常写入屏幕和日志文件。我在某个地方看到了类似的代码,所以我决定使用我看到的同一个例子来学习更多,这个例子与我的有点不同,因为另一个人只需一个函数调用就可以同时编写两个文件。
根据我的理解:
cmd
模块接收string
,然后在接收到的string
上调用output
模块。output
模块接受两个参数-(其中一个参数必须求值为python标准输入模块对象,第二个参数为字符串(fine。然而,由于output
模块调用了logs
模块,该模块可以进行打印或更好地通过从python的标准输出对象调用write
函数来组合参数,并将string
或要写入的文本传递给它。
如果我的解释不清楚,那就意味着我真的不了解整个过程。
我的问题是:当我对函数外调用的put
变量进行了注释或甚至没有调用时,它是如何进入cmd
模块或任何其他模块的?
请在下面查找代码`
import sys
def logs(prints, message):
#global put
#print prints
prints.write(message)
prints.flush()
def output(prints, message):
#global put
#logs(prints, content)
logs(prints, message)
#logs(put, via)
''' This is where the confusion is, how did put get into this function when i did
not declare it...'''
def cmd(message):
#global put
output(put, message)
output(sys.stderr, message)
put = open('think.txt', 'w')
#print put, '000000000'
cmd('Write me out to screen/file')
put.close()
`
这是因为python处理作用域的方式。执行脚本时,日志、输出和cmd函数在模块命名空间中定义。然后put = open('think.txt', 'w')
在模块名称空间中创建一个名为put的变量。
当您调用cmd时,您现在正在函数的本地命名空间中执行。它在调用函数时创建,在函数退出时销毁。当python命中表达式output(put, message)
时,它需要解析名称output、put和message,以查看如何处理它们。函数的规则是,python将在本地函数命名空间中查找名称,如果找不到变量,则返回全局模块命名空间。
因此,python检查函数名称空间中的输出,没有找到任何内容,查看模块名称空间,发现output引用了一个函数对象。然后,它检查函数名称空间中的put,没有找到任何内容,查看模块名称空间,发现put引用了一个打开的文件对象。最后,它查找消息,在函数名称空间中找到它(函数参数进入函数名称空间(,然后关闭它。
put
被声明为global
变量,因此当您从cmd
中访问它时,它正在访问该global
变量,而无需在函数中声明它。
例如,此代码打印5
的原因相同:
def foo():
print "bar: {0}".format(bar)
bar = 5
foo()