Local variable might be referenced before assignment - Python

限于喜欢 提交于 2019-12-11 01:52:59

问题


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.


回答1:


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




回答2:


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)




回答3:


Before run() add encrypted = None



来源:https://stackoverflow.com/questions/43974798/local-variable-might-be-referenced-before-assignment-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!