0

我得到以下代码:

    if os.path.exists("data/ao-1.dat"):
        logininfo = open("data/ao-1.dat", "r").read().split()
        if len(loginInfo[0]) > 0:
            self.AccountsList.connect_1.SetText(logininfo[0])
        else:
            self.AccountsList.connect_1.SetText("Save")
    else:
        self.AccountsList.connect_1.SetText("Save")

##dupe

        if os.path.exists("data/ao-2.dat"):
            logininfo = open("data/ao-2.dat", "r").read().split()
            if len(loginInfo[0]) > 0:
                self.AccountsList.connect_2.SetText(logininfo[0])
            else:
                self.AccountsList.connect_2.SetText("Save")
        else:
            self.AccountsList.connect_2.SetText("Save")

有没有可能让我可以在 Python 中使用循环变量来获取属性?我想防止只为一个数字重复上述代码。

以下将不起作用:

for i in xrange(1, 3):
     if os.path.exists("data/ao-" + str(i) + ".dat"):
          logininfo = open("data/ao-" + str(i) + ".dat", "r").read().split()
          if len(loginInfo[0]) > 0:
                self.AccountsList.connect_(i).SetText(logininfo[0]) #problem
          else:
                self.AccountsList.connect_(i).SetText("Save") #problem
     else:
          self.AccountsList.connect_(i).SetText("Save") #problem

因为 python 不遵循将变量声明为属性名称,所以它有什么方法可以在那里进行循环,否则我将不得不复制代码?

4

3 回答 3

3
getattr(self.AccountsList, 'connect_%d' % i).SetText(logininfo[0])
于 2013-09-03T21:50:40.780 回答
2

使用getattr()函数按名称获取属性。

此外,使用字符串格式而不是字符串连接和with操作文件。您还可以通过在一行中创建 if/else 来稍微简化代码:

for i in xrange(1, 3):
    if os.path.exists("data/ao-%d.dat" % i):
        with open("data/ao-%d.dat" % i) as f:
            logininfo = f.read().split()

        text = logininfo[0] if logininfo[0] else "Save"
        getattr(self.AccountsList, 'connect_%d' % i).SetText(text)
    else:
        getattr(self.AccountsList, 'connect_%d' % i).SetText("Save")

另外,命名有错误:loginInfovs logininfo.

于 2013-09-03T21:50:52.040 回答
1

正如其他人指出的那样,您应该使用getattr(). 另一个一般性评论是,代码中的这种嵌套级别通常表明您应该重新设计代码以使其更加模块化 - 像在代码中那样具有多个嵌套级别会使阅读和/或调试变得非常困难。

于 2013-09-03T21:53:22.417 回答