for k,v in dict ///// TypeError:'str'对象不可调用

时间:2014-08-26 03:29:33

标签: python string dictionary iteration keyvaluepair

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的dict,现在,它根据匹配成功专门显示消息。

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

我尝试删除括号以及其他各种我不记得的东西

有什么想法吗?

2 个答案:

答案 0 :(得分: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

你还有你的循环线(你标记为错误的那一行)缩进太少,但我怀疑这是一个复制/粘贴错误。

答案 1 :(得分:2)

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

但是,您的代码仍然无法正常工作,因为您正在尝试迭代整个文件,就像它是键值对的序列一样。但事实并非如此;它只是一个大字符串。如果你想将它解析为键值对,你需要以某种方式自己做。