有没有办法根据输入更改Python中的变量以防止重复类似的代码块?

问题描述 投票:0回答:1

我对 python 相当陌生,创建了这个程序来计算给定文件的 sha256 或 sha512 哈希值并将计算摘要为十六进制。

它由 5 个文件组成,4 个是自定义模块,1 个是main_。

我在不同的模块中有两个函数,但这些函数的唯一区别是一个变量。见下图:

来自sha256.py

def get_hash_sha256():
    global sha256_hash
    filename = input("Enter the file name: ")
    sha256_hash = hashlib.sha256()
    with open(filename, "rb") as f:
        for byte_block in iter(lambda: f.read(4096),b""):
            sha256_hash.update(byte_block)
#       print("sha256 valule: \n" + Color.GREEN + sha256_hash.hexdigest())
        print(Color.DARKCYAN + "sha256 value has been calculated")
        color_reset()

来自sha512.py

def get_hash_sha512():
    global sha512_hash
    filename = input("Enter the file name: ")
    sha512_hash = hashlib.sha512()
    with open(filename, "rb") as f:
        for byte_block in iter(lambda: f.read(4096),b""):
            sha512_hash.update(byte_block)
#       print("sha512 valule: \n" + Color.GREEN + sha512_hash.hexdigest())
        print(Color.DARKCYAN + "sha512 value has been calculated")
        color_reset()

这些函数在我的 simple_sha_find.py 文件中调用:

def which_hash():
    sha256_or_sha512 = input("Which hash do you want to calculate: sha256 or sha512? \n")
    if sha256_or_sha512 == "sha256":
        get_hash_sha256()
        verify_checksum_sha256()
    elif sha256_or_sha512 == "sha512":
        get_hash_sha512()
        verify_checksum_sha512()
    else:
        print("Type either sha256 or sha512. If you type anything else the program will close...like this.")
        sys.exit()

if __name__ == "__main__":
    which_hash()

如您所见,将调用的函数基于用户输入。如果用户输入 sha256,则会触发 sha256.py 中的函数,但如果用户输入 sha512,则会触发 sha512.py 中的函数

该应用程序可以工作,但我知道我可以减少它的冗余,但我不知道如何做。

如何定义一次 get_hash_sha---() 和 verify_checksum_sha---() 函数,并根据用户选择 sha256 还是 sha512 执行适当的计算?

如果我不清楚,请告诉我,并提前致谢。

我对该程序进行了一些编码变体。

我已将其创建为一个文件,并创建不同的模块并从这些模块调用函数。

无论哪种情况,我都会重复,但我知道这往往会违背自动化的目的。

可能是因为已经晚了,我的注意力都快用完了,但我什至不知道从哪里开始。

python python-3.x sha
1个回答
0
投票

您可以将这两个函数合并为一个函数:

import hashlib

def get_hash(hash_type):
    if hash_type == 'sha256':
        hash_obj= hashlib.sha256()
    elif hash_type == 'sha512':
        hash_obj = hashlib.sha512()
    else:
        print("Invalid hash type.Please choose 'sha256'or'sha512'")
        return

    filename = input("Enter the fileename:  ")
    try:
        with open(filename,"rb") as f:
            for byte_block in iter(lambda: f.read(4096), b""):
                hash_obj.update(byte_block)
        print(Color.DARKCYAN + f"{hash_type} value has been calculated")
        color_reset()
    except FileNotFoundError:
        print(f"File '{filename}' not found.")

def which_hash():
    sha_type =input("Which hash do you want to calculate: sha256 or sha512? \n").lower()
    if sha_type in ['sha256', 'sha512']:
        get_hash(sha_type)
        verify_checksum(sha_type)
    else:
        print("Type sha256 or sha512. If you type anything else program will close. .")
        sys.exit()

if __name__ == "__main__":
    which_hash() 
© www.soinside.com 2019 - 2024. All rights reserved.