使基本密码功能更具可读性

时间:2016-09-20 14:11:00

标签: python python-2.7

我有这个基本的密码功能:

def encrypt_decrypt(data, in_or_out):
    pass_lst = list(data)
    return_list = []

    if in_or_out == "in":
        for i in pass_lst:
            num = ord(i) + 10
            return_list.append(chr(num))
    else:
        for i in pass_lst:
            num = ord(i) - 10
            return_list.append(chr(num))

    return ''.join(return_list)

我想让这个密码更具可读性和一点DRY呃..有没有办法可以成功缩短这个功能?

2 个答案:

答案 0 :(得分:1)

您可以通过从in_or_out参数计算±10来使其干燥。例如,

def encrypt_decrypt(data, in_or_out):
    delta = {'in': 10, 'out': -10}[in_or_out]
    return_list = []
    for i in list(data):
        num = ord(i) + delta
        return_list.append(chr(num))
    return ''.join(return_list)

使用列表理解可以使其更加紧凑:

def encrypt_decrypt(data, in_or_out):
    delta = {'in': 10, 'out': -10}[in_or_out]
    return ''.join([chr(ord(i) + delta) for i in data])

请注意,我正在直接迭代data。如果data是字符串,列表或元组,那将会有效。

但是,您应该知道您的代码不安全:它不处理ord(i) + delta超出0-255范围的字符代码。

答案 1 :(得分:1)

作为一般规则,函数应该一个事物;将两个函数合并为一个,然后使用一个参数来触发实际运行的“嵌入”函数,这是一个反模式。你仍然可以抽象出公共代码(这里,遵循PM 2Ring的定义):

def encrypt(data):
    return _modify(data, 10)

def decrypt(data):
    return _modify(data, -10)

def _modify(data, delta):
    return ''.join([chr(ord(i) + delta) for i in data])

一般来说,你的这对函数不会是这种对称的,并且就一个明确的函数而言,实现它们并不容易。在这种情况下,您肯定不希望将两个实现都填充到一个encrypt_or_decrypt函数中。

(即使你组合它们,也不要使用两组不同的术语。选择“加密”/“解密”或“进入”/“出”之一并坚持下去用于函数名称和传递给参数的值。)

如果您确实需要根据参数值选择加密和解密,请将两个函数存储在字典中:

d = {"encrypt": encrypt, "decrypt": decrypt}

d[in_or_out](value)