Kullanıcı Adı-Parola Eşleştirme Programı

Nov 05 2020

Bu dönem üniversiteye başladım. Kodumu gözden geçirip düşüncelerinizi benimle paylaşır mısınız

# 5-November-2020

username = input("Please enter your username: ")
password = input("Please enter your password: ")

username_password = {
    'Mert': "mertt"
}

if username in username_password:
    if username == "Mert" and password == username_password[username]:
        print("Welcome Sir")
    else:
        print("You're not authorized!")
else:
    confirmation = input("Do you want to register? (Y/N): ")
    if confirmation == "Y":
        username = input("Enter your username: ")
        password = input("Enter your password: ")
        password_2 = input("Confirm your password: ")
        if password == password_2:
            username_password[username] = password
        else:
            print("Your password is incorrect!")
    else:
        print("Good bye")
print(username_password)

Herhangi bir iyileştirme öneriniz varsa lütfen bana söyleyin.

Yanıtlar

3 AryanParekh Nov 05 2020 at 15:44

Girişi doğrula

Programınızın herhangi bir kötü girdi nedeniyle başarısız olmayacağından emin olmalısınız , kullanıcının girmemesi gereken ve programın yanlış davranmasına neden olabilecek bir şey

Programınız için bu mümkün mü? Evet, bu satırı al

username = input("Please enter your username: ")

Kullanıcı Ctrl+Zburaya girerse hataya neden olur ve program durur.

EOFError

Bu istisnaları Python dışında try ve istisna kullanarak yakalayabiliriz

try:
    username = input("Please enter your username: ")
except (Exception, KeyboardInterrupt): 
    print("Please enter a valid username!")

Aynısı giriş için de geçerlidir password

Bir adım sonra, ayrıntıların uzunluğunu, yani kullanıcı adı veya parolanın çok kısa olup olmadığını da kontrol etmek istiyorum. Doğruysa özel bir mesaj göster


Bir istisna hakkında

Daha önce yaptığımız değişiklikler nedeniyle, programın sonlandırılması yerine bir istisna yakalarsak kolayca bir hata mesajı yazdırabiliriz.
Ama sonra ne olacak?

Kötü girişi işleyemediğiniz için programı orada durdurmak için iki seçeneğiniz vardır veya tekrar giriş isteyebilirsiniz.
İkinci seçeneği seçerseniz, bu birkaç satır daha kod alır, ancak kesinlikle daha iyidir çünkü kullanıcı tüm programı tekrar çalıştırmak yerine başka bir şans whileelde eder.Bunun için, onu elde edene kadar yinelenecek bir döngüye sarmamız gerekir. geçerli girdi

def username_input():
    while True:
        try:
            username = input("Please enter your username: ")
        except Exception:
            print("Please a enter valid username! \n\n")
            continue 
        return username

def password_input():
    while True:
        try:
            password = input("Please enter your password: ")
        except Exception:
            print("Please enter a valid password! \n\n")
            continue
        return password

Burada kendimizi tekrarlıyoruz, işlevler aynı. Küçük bir hack ile kodu temizleyebiliriz

def ask_input(field):
    while True:
        try:
            word = input(f"Please enter your {field}: ")
        except (Exception, KeyboardInterrupt):
            print(f"Please enter a valid {field}! \n\n")
            continue
        if not word: continue # if field is empty
        return word

def take_input():
    username = ask_input("username")
    password = ask_input("password")
    return username, password

Çalışmayı işlevlere ayırın

Son olarak, bir şeyi bir işleve taşıdığımı fark etmiş olmalısın.

SRP kuralını veya Tek sorumluluk ilkesini izlersek, kodumuzu gerçekten temizleyebiliriz

Tek sorumluluk ilkesi (SRP), bir bilgisayar programındaki her modülün, sınıfın veya işlevin, o programın işlevselliğinin tek bir parçası üzerinde sorumluluk sahibi olması gerektiğini belirten bir bilgisayar programlama ilkesidir.

Bu programda girdi alma görevini atarsak, diyelim ki take_input(), aynı görevi tekrar gerçekleştirmek istersek, aynı kod parçasını kopyalayıp yapıştırmadan aynı işlevi yeniden kullanabiliriz.

username, password = take_input()
process_login( username, password ):
  • take_input()girdi ile ilgili görevlerle ilgilenecek ve uygun şekilde geçerliliğe sahip olduğunda bir usernamevepassword
  • process_login() kayıtlara göre girişin yetkili olup olmayacağına karar verir

Anahtarla kontrol edin username

if username in username_password:
    if username == "Mert" and password == username_password[username]:
        print("Welcome Sir")
    else:
        print("You're not authorized!")

Bu şu anda çalışıyor, ancak yalnızca kayıtların boyutunun olması nedeniyle 1, eklenen herhangi bir ekstra kayıt ve algoritmanız başarısız olacak, boyut olsaydı, ifadeler 50yazamazsanız 50, girilen kullanıcı adı ile kontrol etmeniz gerekir.

def process_login(username, password, records):
    try:
        if records[username] == password:
            print("Authorized")
            return True
    except KeyError:
        print("Not authroized")
        return False

Burada, eğer usernamemevcut değilse records, bir KeyErrorben yakalamak ve baskı edecek olan yükseltilirNot authorized


Yeniden yazılmış

def ask_input(field):
    while True:
        try:
            word = input(f"Please enter your {field}: ")
        except (Exception, KeyboardInterrupt):
            print(f"Please enter a valid {field}! \n\n")
            continue
        if not word: continue

        return word

def take_input():
    username = ask_input("username")
    password = ask_input("password")
    return username,password


def process_login(username, password, records):
    try:
        if records[username] == password:
            print("Authorized")

    except KeyError:
        print("Not authroized")
        

Son kısım olan "kayıt" kısmını atladım. Bundan sonra açıklayacağım

records = {
    "__Testu" : "__Testp",
    "__Testu2" : "__Testp2"
}

username, password = take_input()
process_login(username, password, records)

Kayıtları bir dosyaya yazın

Şu anda olduğu gibi, sözlüğünüze önceden bir kayıt eklemişsinizdir, bundan sonra eklenen herhangi bir kayıt, programı bir sonraki çalıştırışınızda anlamsızdır, sözlük, eklediğiniz aynı kayıtla yeniden başlatılacaktır.
Kullanıcı kayıtlarını kaydetmenin bir yoluna ihtiyacınız var, böylece programınızı bir sonraki açışında önceki bilgileri kaydedilir.

Bunu yapmanın en iyi yolu, kullanıcının Python'daki csv modülüdür - csv.DictReaderbu, sizin için dosyanın tüm okunmasını / yazılmasını otomatikleştirecektir. Ama kendi başınıza yazmanız gereken bir şey.

Şerefe

>>> Please enter your username: (empty input)
>>> Please enter your username: __Testu
>>> Please enter your password: (empty input)
>>> Please enter your password: __Testp

>>> Authorized