3

我需要引入大整数常量(用于 Diffie-Hellman 密钥交换的素数)

以符合 PEP8 的方式这样做的最 Pythonic / 漂亮的方式是什么?最好没有反斜杠。

我目前的方法是这样的:

N = '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1
       29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD
       EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245
       E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED
       EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381
       FFFFFFFF FFFFFFFF'''
PRIME = int('0x{0}'.format(N.replace('\n', '').replace(' ', '')), 16)

不是很漂亮,但比:

PRIME = 179769313486231590770839156793787453197860296048756011706444423684197180216158519368947833795864925541502180565485980503646440548199239100050792877003355816639229553136239076508735759914822574862575007425302077447712589550957937778424442426617334727629299387668709205606050270810842907692932019128194467627007L

编辑

变成PRIME = int(re.sub('\s+', '', N), 16)

4

3 回答 3

4

来自PEP 8 风格指南

但最重要的是:知道何时不一致——有时风格指南并不适用。如有疑问,请使用您的最佳判断。查看其他示例并决定什么看起来最好。不要犹豫,问!

所以保持不变,因为它比任何其他不明显的黑客更具可读性

而且最重要的是Readability counts.

没有什么能超越 Python 的核心原则

但必须有一种更优雅的方式来执行 PRIME = int('0x{0}'.format(N.replace('\n', '').replace(' ', '')), 16).. .

如果你坚持

PRIME=long('17976931348623159077083915679378745319786029604875601'
          '17064444236841971802161585193689478337958649255415021805654859805'
          '03646440548199239100050792877003355816639229553136239076508735759'
          '91482257486257500742530207744771258955095793777842444242661733472'
          '7629299387668709205606050270810842907692932019128194467627007L')
于 2013-09-09T06:45:33.613 回答
3

坦率地说,你所拥有的相当不错。唯一明显的变化是您的最终转换:您可以删除该位并在给出基数 16"0x{0}".format时传递替换的字符串。int

除此之外,您始终可以将其隐藏为一个功能:

def PrimeInt(string):
    return int(string.replace('\n','').replace(' ',''), 16)

PRIME = PrimeInt("""
        FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1
        29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD
        EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245
        E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED
        EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381
        FFFFFFFF FFFFFFFF
        ''')
于 2013-09-09T06:58:18.497 回答
1

如果你想让一些东西看起来不错,也许你可以从字符串转换为整数。虽然它可能不是最佳实践,因为我从未真正看到它在实践中使用过,但我认为它比原始方法更清晰,因为转换有限

number = (
    "179769313486231590770839156793787453197860296048756011"
    "706444423684197180216158519368947833795864925541502180"
    "565485980503646440548199239100050792877003355816639229"
    "553136239076508735759914822574862575007425302077447712"
    "589550957937778424442426617334727629299387668709205606"
    "050270810842907692932019128194467627007"
)
number = int(number)
179769313486231590770839156793787453197860296048756011706444423684197180216158519368947833795864925541502180565485980503646440548199239100050792877003355816639229553136239076508735759914822574862575007425302077447712589550957937778424442426617334727629299387668709205606050270810842907692932019128194467627007L
于 2013-09-09T06:49:10.327 回答