模块变量导入是新手坑啊--记我犯的一个关于模块变量的错误

76 views
Skip to first unread message

李海珍

unread,
Jan 17, 2014, 11:24:06 PM1/17/14
to pyth...@googlegroups.com
背景:我开发一个Flask应用时,有一个config.py模块,里面有一个Config类,和Dev(Config),Product(Config)
等类,来根据是开发环境还是生产环境来对Flask进行配置,当然Flask工作得好好的.
但是,我想在其他模块中也引用这个配置的关于DEBUG的变量值,
我就在config放一个模块变量为DEBUG
在Flask的app的工厂方法中,根据当前应用的配置,来更改config模块的DEBUG变量.
我以为这个想法是没有问题的,
我是这样做的:
from config import  DEBUG

def  app_factory(cfg):
     DEBUG
=cfg.DEBUG

然后我在其他模块,也这样:
from config import DEBUG
结果,我发现,不管我怎么修改,DEBUG值都是最开始的值,
气死我了,之后,我再用判断是不是DEBUG的话,我就从根据Flask的app中配置来判断了..
这个问题,也就一直放下了,
直到有一天,我看官方文档看到了这里:
我顿时觉得泪流满面啊!
原来是这个问题啊..
我是这样理解的:
config.py模块有一个DEBUG变量,
config模块加载之后,这个DEBUG变量就活在config的世界里了,
如果我在另一个模块中的log.py模块中
这个做
from config import DEBUG
那么在加载log.py模块时,其实是肯定是先加载了config模块,再加载log.py模块,
然后在log.py的模块的世界中创建了DEBUG变量的一个副本.
如果config世界中的DEBUG变量改变了,log中副本不变跟着变的.

大家觉得我的理解对吗?

总结:使用from module import name1,name2
这样的方式是有不一致的风险的.
如果有模块变量,或者有可能在运行时变化的成员时,还是使用import module的方式吧.


limodou

unread,
Jan 17, 2014, 11:43:58 PM1/17/14
to Python.cn@google
是这样的。和名字空间有关系。所以如果是全局的模块,不要使用from import这种形式。


2014/1/18 李海珍 <banx...@gmail.com>

--
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
详情: http://code.google.com/p/cpyug/wiki/CpyUg
G+: https://plus.google.com/u/0/communities/108786798869709602787
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 python-cn+...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。



--
I like python!
UliPad <<The Python Editor>>: http://code.google.com/p/ulipad/
UliWeb <<simple web framework>>: https://github.com/limodou/uliweb
My Blog: http://my.oschina.net/limodou

Shell Xu

unread,
Jan 18, 2014, 1:19:27 AM1/18/14
to CPUG

首先,你show出来的代码绝对是local变量覆盖global的问题。其次,全局set一般是import了模块来做的。

from nexus 4

李海珍

unread,
Jan 18, 2014, 1:50:50 AM1/18/14
to pyth...@googlegroups.com
嗯,代码,写错了,最开始是有这个问题,后来我改了,
应该是
import config
config.DEBUG = cfg.DEBUG

开始以为这样就好,但是结果还是不行.
所以是其他地方引入的是之前的老的副来的原因.


在 2014年1月18日星期六UTC+8下午2时19分27秒,shell909090写道:

Haoxun Zhan

unread,
Jan 18, 2014, 3:59:18 AM1/18/14
to pyth...@googlegroups.com
这个坑我踩过,之后都把这种全局变量封装到一个或多个类里作为static variable,再用classmethod对变量进行访问控制。


2014/1/18 李海珍 <banx...@gmail.com>

Shell Xu

unread,
Jan 18, 2014, 6:06:31 AM1/18/14
to CUPG
所以不要拿错的代码来问已经知道的问题阿。。。


2014/1/18 李海珍 <banx...@gmail.com>



--
彼節者有間,而刀刃者無厚;以無厚入有間,恢恢乎其於游刃必有餘地矣。
blog: http://shell909090.com/blog/
about.mehttp://about.me/shell909090

李海珍

unread,
Jan 18, 2014, 11:28:39 AM1/18/14
to pyth...@googlegroups.com

sorry, 上面的代码是为了说明问题临时写的。本来只是想一个模块变量有被动态改变过。但没想到犯了另一个新手错误,就是局部变量覆盖了全局变量。相信有了这个讨论交流记录,我对这两个错误的印象更深了。同时也希望能稍稍帮助的这里的新人(假设这里有跟我一样的新人)

Goldfish Huang

unread,
Jan 22, 2014, 8:16:48 PM1/22/14
to pyth...@googlegroups.com
这个不算坑。你需要注意Python的“变量名”不是一个指针。估计你硬套了C++语言的经验才会这样子。不过在C++里面也有引用这种东西啊。


--
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: pyth...@googlegroups.com
详情: http://code.google.com/p/cpyug/wiki/CpyUg
G+: https://plus.google.com/u/0/communities/108786798869709602787
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 python-cn+...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。



--
免服务器办公室聊天软件、笔记本、日记本:http://besteam.im/
Python及Qt相关Blog:http://hgoldfish.com/
Reply all
Reply to author
Forward
0 new messages