对于dict/////TypeError中的k,v,error:“str”对象不是callab

2024-10-06 12:36:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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()

这是一个粗略的“登录”模块,它遍历位于密码.txt目前,只显示基于匹配成功的消息。在

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

我试着去掉括号以及其他我不记得的东西

有什么想法吗?在


Tags: selftxtgodef错误usernamepasswordfile
2条回答

除了其他问题(见下文),您将self.readfile设置为字符串,而不是函数。您意外地调用了而不是获取函数本身。你想要:

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

你还有很多其他的问题。例如,read方法的返回值是一个字符串,而不是映射或您期望的任何序列,因此for k, v in self.readfile()将无法工作。首先,您需要将字符串解析为字典或元组序列,或者您期望的任何内容,当然,这取决于您的需求和文件的内容。作为补充说明,如果您确实想要一个字典(比如,mydict),您应该首先取出循环,然后检查mydict.get(self.username) == self.password。在

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

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

但是,您的代码仍然无法工作,因为您试图迭代整个文件,就好像它是一系列键-值对。但不是,只是一根大绳子。如果你想把它解析成键值对,你需要自己去做。在

相关问题 更多 >