请问:Python能不能动态建立变量?

请问:Python能不能动态建立变量?

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

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

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

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

  谢谢大家的指点,小弟不胜感激!
for line in vfile:
    eval(line)

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


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

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

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

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

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

[Copy to clipboard] [ - ]
CODE:
import ConfigParser import string
_ConfigDefault = {
    "database.dbms":            "mysql",
    "database.name":            "",
    "database.user":            "root",
    "database.password":        "",
    "database.host":            "127.0.0.1"
    }
def LoadConfig(file, config={}):
    """
    returns a dictionary with keys of the form
    <section>.<option> and the corresponding values
    """
    config = config.copy(  )
    cp = ConfigParser.ConfigParser(  )
    cp.read(file)
    for sec in cp.sections(  ):
        name = string.lower(sec)
        for opt in cp.options(sec):
            config[name + "." + string.lower(opt)] = string.strip(
                cp.get(sec, opt))
    return config
if _ _name_ _=="_ _main_ _":
    print LoadConfig("some.ini", _ConfigDefault)



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

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

把lib目录加到PYTHONPATH里

[Copy to clipboard] [ - ]
CODE:
import sys
sys.path.insert(0, '/path/to/your/module')

小弟接触Python时间不长,以前一直用Perl和PHP,以后还有问题的话请多多指教,谢谢了!
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里面的确可以用来创建变量.
eval(var_record)
忘记那个该死的split
是这样
提个建议
conf_file_url+self.conf_file_name

改成用os.path.join(conf_file_url, self.conf_file_name)
谢谢大家!
好像还是不行,eval只能求出一个表达式的值吧。还有没有其他办法?