Local variable might be referenced before assignment

Question:

I’ve been trying to make an encryption and decryption system but I have run into a small error. Here is my code:

import sys
import pyperclip

def copy(data):
    question = input("Copy to clipboard? ")
    if question.lower() == 'yes' or question.lower() == 'y':
        pyperclip.copy(data)
        print("Encrypted message copied to clipboard.")
        rerun()
    elif question.lower() == 'no' or question.lower() == 'n':
        rerun()
    else:
        print("You did not enter a valid input.")
        copy(data)

def rerun():
    ask = input("nWould you like to run this program again? ")
    if ask.lower() == "yes" or ask.lower() == "y":
        print(" ")
        run()
    elif ask.lower() == 'no' or ask.lower() == 'n':
        sys.exit("nThank you!")
    else:
        print("You did not enter a valid input.")
        rerun()

def encrypt(key, msg):
    encrypted_message = []
    for i, c in enumerate(msg):
        key_c = ord(key[i % len(key)])
        msg_c = ord(c)
        encrypted_message.append(chr((msg_c + key_c) % 127))
    return ''.join(encrypted_message)

def decrypt(key, encrypted):
    msg = []
    for i, c in enumerate(encrypted):
        key_c = ord(key[i % len(key)])
        enc_c = ord(c)
        msg.append(chr((enc_c - key_c) % 127))
    return ''.join(msg)

def run():
    function_type = input("Would you like to encrypt or decrypt a message? ")
    if function_type.lower() == "encrypt" or function_type.lower() == "e":
        key = input("nKey: ")
        msg = input("Message: ")
        data = encrypt(key, msg)
        enc_message = "nYour encrypted message is: " + data
        print(enc_message)
        copy(data)
    elif function_type.lower() == "decrypt" or function_type.lower() == "d":
        key = input("nKey: ")
        question = input("Paste encrypted message from clipboard? ")
        if question.lower() == 'yes' or question.lower() == 'y':
            encrypted = pyperclip.paste()
            print("Message: " + encrypted)
        elif question.lower() == 'no' or question.lower() == 'n':
            encrypted = input("Message: ")
        else:
            print("You did not enter a valid input.")
            run()
        decrypted = decrypt(key, encrypted)
        decrypted_message = "nYour decrypted message is: " + decrypted
        print(decrypted_message)
        copy(decrypted)
    else:
        print("nYou did not enter a valid input.n")
        run()

run()

It says local variable ‘encrypted’ might be referenced before assignment and highlights

decrypted = decrypt(key, encrypted)

under the run() function.

Is it because I used the variable encrypted in other functions? If so, how would I fix this and still maintain the functionality of my program?

I am relatively new to python so I would appreciate it if you could explain your answers.

Asked By: rocketsnstuff

||

Answers:

if the else branch is executed then encrypted is not defined. The IDE doesn’t know you call run() again.

Keep in mind this might lead to an infinite recursion so you should be using another control flow mechanism (try using a while loop that breaks when the input is valid). See Asking the user for input until they give a valid response.

Answered By: DeepSpace

Before run() add encrypted = None

Answered By: mohammad

local variable ‘encrypted’ might be referenced before assignment

is a warning generated by the linter.

This is because the linter sees that encrypted is assigned values inside two if conditions

 if question.lower() == 'yes' or question.lower() == 'y':

and

elif question.lower() == 'no' or question.lower() == 'n':

however, the linter cannot know that these two if conditions are complementary to each other. So, considering the case when none of the conditions is true, the variable encrypted will end up uninitialized.

To get rid of this warning, you can simply initialize the variable before any of the if conditions with None value

Answered By: sid-m
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.