免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5347 | 回复: 6
打印 上一主题 下一主题

单独的python程序文件如何使用getattr(obj,attribute)类似的方法去改变全局变量? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-23 12:42 |只看该作者 |倒序浏览
单独的python程序文件如何使用getattr(obj,attribute)类似的方法去改变全局变量?

最近在写一个小工具程序只有一个程序文件 ,要完成这样一个工作,
举例说明:

两个全量变量
FundType[]
SourceType[]

一个文本文件内容为
1,FundType
2,SourceType
3,FundType
4,SourceType

目标是根据文本文件第二栏的名字设置对应全局变量的值
>>>FundType
['1','3']
>>>SourceType
['2','4']

当然用很多个if - else是可以完成的,但是PHP,perl都有通过字符串去访问同名变量的方法

而且如果obj是对象或模块python中可以用getattr(obj,attribute)的方法去访问obj.attribute

对于本文件的全局变量我却不知道如何处理,另制作一个模块再导入不作为一个解决方法

请教了
谢谢

附:下面是我找到的一个类似问题的解决方法但实在是太 ugly !

网址:http://quke.cn/log-208.html
#######################################################################################
在python如何获得自身模块的引用

在python中有个getattr和函数,非常强大,可以用字符串的形式获得一个模块中属性,函数的引用
或者叫句柄;但有个小疑问就是无法直接获得当前模块的一个属性或函数,我曾苦苦的找寻了一段时
间我以为用self之类的简单的内置的属性或之类的东西来作为自身模块的引用,但不幸的是一直没找
到,可能没有这种东西。

    最后解决的方式就是在当前模块中引入自己,用from import方式来引入似乎让人感觉不太正常,
    为什么要在自身中在引入自己呢?实在没办法就退而求其次,在用到的地方在动态的引入吧。
    最后的解决方式就是使用__import__('模块路径')来引入自己。代码如下:

#包名:lib.templatetags
#模块名:tags.py  
class temClass(object):  
        __init__(self):   
        pass  def main():  
selfMod = __import__('lib.templatetags.tags')  
getattr(selfMod.templatetags.tags, temClass)  


其中selfMod = __import__('lib.templatetags.tags') 执行完得到是lib的引用,
但是如果selfMod = __import__('lib')得到就是包含了更过的引用,
这些是我不需要的,不能因此增加服务器的负担。


代码中是获得属性的例子,设置或删除属性的例子同理。
#######################################################################################

论坛徽章:
0
2 [报告]
发表于 2009-02-23 13:37 |只看该作者
把变量放到字典里,用‘FundType‘,‘SourceType’作key行不行?

论坛徽章:
0
3 [报告]
发表于 2009-02-23 13:53 |只看该作者
如果不能改变存储变量的文本文件的格式,修改全局字典也可。
var=0
a=globals()
a['var']=12

[ 本帖最后由 luffy.deng 于 2009-2-23 13:56 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-02-23 15:58 |只看该作者

回复 #2 luffy.deng 的帖子

偶也在想能不能试一下内容为列表的字典,晚上回去试一试,不过还不是最直接的解决

论坛徽章:
0
5 [报告]
发表于 2009-02-23 16:38 |只看该作者
原帖由 lcfeng 于 2009-2-23 15:58 发表
偶也在想能不能试一下内容为列表的字典,晚上回去试一试,不过还不是最直接的解决

可以试一下修改全局字典比如 globals()['FundType']=['1','3']

论坛徽章:
0
6 [报告]
发表于 2009-02-23 20:03 |只看该作者
help(exec)

论坛徽章:
0
7 [报告]
发表于 2009-02-23 21:21 |只看该作者

回复 #6 Lonki 的帖子

试了一下exec 和 globals()[] 都可以完成这个目标




哈 受教了

[ 本帖最后由 lcfeng 于 2009-2-23 21:30 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP