0
import getpass

class LogInNow(object):

    def __init__(self, file):
        self.openfile = open(file, 'r')
        self.readfile = self.openfile.read()

    def authenticate(self):
        self.username = raw_input("Enter Username> ")
        self.password = getpass.getpass("Enter Password> ")
        for k, v in self.readfile():  <---------------------------------
            if k == self.username and v == self.password:
                print "It worked"
            else:
                print "Fail"""

go = LogInNow("password.txt")
go.authenticate()

这是一个粗略的“登录”模块,它遍历位于 password.txt 上的字典,目前仅显示基于匹配成功的消息。

错误显示在标题中,错误行是带箭头的行。

我试过删除括号以及我不记得的所有其他东西

有任何想法吗?

4

2 回答 2

2

除了其他其他问题(见下文),您设置self.readfile为字符串,而不是函数。您不小心调用 self.openfile.read()而不是获取函数本身。你自找的:

self.readfile = self.openfile.read  # <-- No parentheses at the end!

你还有各种各样的其他问题。例如,该read方法的返回值是一个字符串,而不是一个映射或任何你期望的序列,所以for k, v in self.readfile()不会工作。您需要首先将字符串解析为字典、元组序列或您期望的任何内容——当然,您如何做到这一点取决于您的要求和文件的内容。附带说明一下,如果您确实想要字典(例如,mydict),您应该首先取出循环并检查是否mydict.get(self.username) == self.password.

您的循环行(您标记为错误的行)也缩进太少,尽管我怀疑这是一个复制/粘贴错误。

于 2014-08-26T03:32:47.007 回答
2

当您定义 时readfile,您已经调用了该read函数,因此readfile设置为该函数的返回值 --- 即包含文件内容的字符串。你不能调用那个字符串。将循环更改为for k, v in self.readfile或将之前的行更改为self.readfile = self.openfile.read.

但是,您的代码仍然无法工作,因为您正在尝试遍历整个文件,就好像它是一系列键值对一样。但事实并非如此;它只是一个大字符串。如果你想把它解析成键值对,你需要自己做。

于 2014-08-26T03:34:23.013 回答