Если True: обновить, если False: перезапустить

import getpass

class UserRegistration(object):

    def __init__(self):
        pass

    def register(self):
        register = self.register
        self.username_and_password = {}
        username = raw_input("Choose Username> ")
        password = getpass.getpass("Choose Password> ")
        confirm_password = getpass.getpass("Confirm Password> ")
        if password == confirm_password:
            self.username_and_password[username] = password
        else:
            print "Passwords didn't match"
            return register

go = UserRegistration()
go.register()

Простая программа, которая запрашивает у пользователя имя пользователя и пароль

Если пароли не совпадают, я хочу, чтобы он перезапустил процесс и попросил пользователя снова ввести пароль

В данный момент он печатает строку, но не перезапускает процесс.

Есть идеи?

2 ответа

Решение

Вызовите метод снова:

   else:
        print "Passwords didn't match"
        self.register()

def register(self): это метод класса, поэтому вы вызываете его с self.register,, нет необходимости использовать register = self.register

Если вы просто хотите запросить пароль и сохранить информацию о нескольких экземплярах в dict:

class UserRegistration(object):
    username_and_password = {}
    def __init__(self):
        self.username = ""
    def register_name(self):
        self.username = raw_input("Choose Username> ")
        self.register_pass()

    def register_pass(self):
        password = getpass.getpass("Choose Password> ")
        confirm_password = getpass.getpass("Confirm Password> ")
        if password == confirm_password:
            self.username_and_password[self.username] = password
        else:
            print "Passwords didn't match"
            self.register_pass()

Вы также можете использовать цикл while:

class UserRegistration(object):
    username_and_password = {}
    def __init__(self):
        self.username = ""
    def register_name(self):
        while True:
            self.username = raw_input("Choose Username> ")
            if self.username in self.username_and_password:
                print "Username taken, please try again"
                continue
            else:
                return self.register_pass()

    def register_pass(self):
        while True:
            password = getpass.getpass("Choose Password> ")
            confirm_password = getpass.getpass("Confirm Password> ")
            if password == confirm_password:
                self.username_and_password[self.username] = password
                return
            else:
                print "Passwords didn't match"
                continue

Вам нужно вызвать self.register(), и вызов метода register () сделает это, но таким способом, который в конечном итоге не окупится. (Хотя то, что вам действительно нужно, - это просто цикл. Рекурсия приведет к бессмысленным копиям вашего класса в стеке.)

То, что здесь не так, указывает на необходимость изложить действительно базовую концепцию Python:

Имена Python не делают или не вызывают вещи. Только операторы делают, и они делают это, вызывая именованные методы некоторого объекта. Так что именно круглые скобки или точка, если вы используете свойство, вызывают выполнение. Функции, и даже методы или свойства являются объектами. Сказать "вернуть регистр" означает "вернуть объект, представляющий функцию, которая делает это", а не "вызвать эту функцию и вернуть результат".

Кроме того, поскольку людям трудно думать о методе, а не о функции, как об объекте, присвоение self.register другой переменной является странным. Ссылка на связанные вещи с локальными переменными, особенно с одним и тем же именем, как правило, является способом создания ошибок, если вы не делаете что-то довольно богато.

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