免费注册 查看新帖 |

Chinaunix

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

请问:Python能不能动态建立变量? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-10 16:40 |只看该作者 |倒序浏览
假设自己定义了这样的配置文件(info.conf):

  C_NAME=小明
  C_AGE=18
  ......

  我用Python程序循环读取该文件的每一行,然后希望能依次动态建立以等号左边命名的变量,值自然为右边的值,在Perl中可以轻松做到,不知道Python可不可以?希望各位大侠给予指点.

  还有一个问题,假设我把一个名为test.py的文件放到game文件夹下面的lib文件夹里,那么我在game文件夹又建立一个名为play.py的文件,问:在game/play.py文件中怎么调用game/lib/test.py中写的自定义类?

  谢谢大家的指点,小弟不胜感激!

论坛徽章:
0
2 [报告]
发表于 2006-10-11 00:27 |只看该作者
for line in vfile:
    eval(line)

首先确定game在你的import路径里面,那么就用import lib.test就可以了

论坛徽章:
0
3 [报告]
发表于 2006-10-12 23:23 |只看该作者
原帖由 hsb857 于 2006-10-10 16:40 发表

假设自己定义了这样的配置文件(info.conf):

  C_NAME=小明
  C_AGE=18
  ......

  我用Python程序循环读取该文件的每一行,然后希望能依次动态建立以等号左边命名的变量,值自然为右边的值,在Perl中可以轻松做到,不知道Python可不可以?希望各位大侠给予指点.

用ConfigParser模块。可以参考下面的代码,来自Python Cookbook 4.12一节。虽然复杂了一些。

  1. import ConfigParser import string
  2. _ConfigDefault = {
  3.     "database.dbms":            "mysql",
  4.     "database.name":            "",
  5.     "database.user":            "root",
  6.     "database.password":        "",
  7.     "database.host":            "127.0.0.1"
  8.     }
  9. def LoadConfig(file, config={}):
  10.     """
  11.     returns a dictionary with keys of the form
  12.     <section>.<option> and the corresponding values
  13.     """
  14.     config = config.copy(  )
  15.     cp = ConfigParser.ConfigParser(  )
  16.     cp.read(file)
  17.     for sec in cp.sections(  ):
  18.         name = string.lower(sec)
  19.         for opt in cp.options(sec):
  20.             config[name + "." + string.lower(opt)] = string.strip(
  21.                 cp.get(sec, opt))
  22.     return config
  23. if _ _name_ _=="_ _main_ _":
  24.     print LoadConfig("some.ini", _ConfigDefault)
复制代码

原帖由 hsb857 于 2006-10-10 16:40 发表

  还有一个问题,假设我把一个名为test.py的文件放到game文件夹下面的lib文件夹里,那么我在game文件夹又建立一个名为play.py的文件,问:在game/play.py文件中怎么调用game/lib/test.py中写的自定义类?

把lib目录加到PYTHONPATH里

  1. import sys
  2. sys.path.insert(0, '/path/to/your/module')
复制代码

论坛徽章:
0
4 [报告]
发表于 2006-10-13 00:35 |只看该作者

多谢啦!

小弟接触Python时间不长,以前一直用Perl和PHP,以后还有问题的话请多多指教,谢谢了!

论坛徽章:
0
5 [报告]
发表于 2006-10-13 02:42 |只看该作者

回复 2楼 ttvast 的帖子

eval报错

#ReadConf.py
import re#导入正则表达式模块
conf_file_url='./Config/'#配置文件所在目录

class ReadConf:
       
        def __init__(self,file_name):
                #初始化配置文件名变量
                self.conf_file_name=''
               
                #如果file_name值不为空则将其值赋给conf_file_name变量
                if not re.match("\s",file_name):
                        if not file_name.isalnum():
                                self.conf_file_name=file_name
                        else:
                                return 0
               
        def getConfFile(self):
                return self.conf_file_name
               
        def readConfText(self):
                try:
                        conf_file=open((conf_file_url+self.conf_file_name),"r")#打开设定的配置文件
                except IOError,err_msg:
                        print >> sys.stderr,'在打开',conf_file_name,'配置文件时出现IO异常,详细信息:',err_msg,'.'
                        sys.exit(1)
               
                var_records=conf_file.readlines()#读取配置文件所有行
               
                for var_record in var_records:
                        print var_record
                       
        def readConfVar(self):
                try:
                        conf_file=open((conf_file_url+self.conf_file_name),"r")
                except IOError,errmsg:
                        print >> sys.stderr,'在打开',conf_file_name,'配置文件时出现IO异常,详细信息:',err_msg,'.'
                        sys.exit(1)
                       
                var_records=conf_file.readlines()#读取配置文件所有行
               
                for var_record in var_records:
                        if not (re.match("#",var_record) or re.match("\n",var_record)):
                                var_record=var_record.split('=')
                                eval(var_record[0])=var_record[1]
                               
#TEST
#a=ReadConf('info.conf')
#a.readConfVar()
                       
#End
               
错误信息:
Traceback (most recent call last):
  File "test.py", line 10, in ?
    from ReadConf import ReadConf
  File "./ClassLib/ReadConf.py", line 45
    eval(var_record[0])=var_record[1]
SyntaxError: can't assign to function call

这出的什么问题,我感觉eval()好像只能做为求值,不过在JavaScript里面的确可以用来创建变量.

论坛徽章:
0
6 [报告]
发表于 2006-10-13 08:06 |只看该作者
eval(var_record)
忘记那个该死的split

论坛徽章:
0
7 [报告]
发表于 2006-10-13 11:17 |只看该作者
是这样

论坛徽章:
0
8 [报告]
发表于 2006-10-13 13:10 |只看该作者
提个建议
conf_file_url+self.conf_file_name

改成用os.path.join(conf_file_url, self.conf_file_name)

论坛徽章:
0
9 [报告]
发表于 2006-10-13 19:03 |只看该作者
谢谢大家!

论坛徽章:
0
10 [报告]
发表于 2006-10-15 23:32 |只看该作者
好像还是不行,eval只能求出一个表达式的值吧。还有没有其他办法?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP