python stdout 和 stderr:当我没有声明全局时,我很困惑我的文件对象是如何传递到的



我无法理解sys.stdoutsys.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)时,它需要解析名称outputputmessage,以查看如何处理它们。函数的规则是,python将在本地函数命名空间中查找名称,如果找不到变量,则返回全局模块命名空间。

因此,python检查函数名称空间中的输出,没有找到任何内容,查看模块名称空间,发现output引用了一个函数对象。然后,它检查函数名称空间中的put,没有找到任何内容,查看模块名称空间,发现put引用了一个打开的文件对象。最后,它查找消息,在函数名称空间中找到它(函数参数进入函数名称空间(,然后关闭它。

put被声明为global变量,因此当您从cmd中访问它时,它正在访问该global变量,而无需在函数中声明它。

例如,此代码打印5的原因相同:

def foo():
    print "bar: {0}".format(bar)
bar = 5
foo()

相关内容

  • 没有找到相关文章

最新更新