Для k, v в dict ///// TypeError: объект 'str' не вызывается

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

Это грубый модуль "входа в систему", который выполняет итерацию через dict, расположенный в password.txt, и на данный момент отображает исключительно сообщения, основанные на успешном совпадении.

Ошибка отображается в заголовке, а ошибочная строка - та, что со стрелкой.

Я пытался удалить скобки, а также все другие вещи, которые я не помню

Есть идеи?

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,

У вас также есть строка зацикливания (та, которую вы пометили как ошибку) слишком мало отступили, хотя я подозреваю, что это ошибка копирования / вставки.

Когда вы определили readfileВы уже назвали read функция, так readfile устанавливается на возвращаемое значение этой функции, а именно, строку, содержащую содержимое файла. Вы не можете назвать эту строку. Либо измените ваш цикл на for k, v in self.readfile или измените свою предыдущую строку на self.readfile = self.openfile.read,

Тем не менее, ваш код по-прежнему не будет работать, потому что вы пытаетесь перебрать весь файл, как если бы он был последовательностью пар ключ-значение. Но это не так; это просто одна большая строка. Если вы хотите разобрать его в пары ключ-значение, вам нужно как-то это сделать самостоятельно.

Другие вопросы по тегам