引入大整数常量的最优雅/ pythonic方法是什么?

时间:2013-09-09 06:41:18

标签: python coding-style pep8

我需要引入大整数常量(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)

3 个答案:

答案 0 :(得分:4)

来自PEP 8 Style Guide

  

但最重要的是:知道何时不一致 - 有时是   风格指南不适用。如有疑问,请使用您的最佳判断。   查看其他示例并确定最佳效果。不要犹豫   问!

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

最重要的是Readability counts.

没有什么比Python的核心原则更重要了

  

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

如果你坚持

PRIME=long('17976931348623159077083915679378745319786029604875601'
          '17064444236841971802161585193689478337958649255415021805654859805'
          '03646440548199239100050792877003355816639229553136239076508735759'
          '91482257486257500742530207744771258955095793777842444242661733472'
          '7629299387668709205606050270810842907692932019128194467627007L')

答案 1 :(得分:3)

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

除此之外,你总是可以隐藏它一个功能:

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
        ''')

答案 2 :(得分:1)

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

number = (
    "179769313486231590770839156793787453197860296048756011"
    "706444423684197180216158519368947833795864925541502180"
    "565485980503646440548199239100050792877003355816639229"
    "553136239076508735759914822574862575007425302077447712"
    "589550957937778424442426617334727629299387668709205606"
    "050270810842907692932019128194467627007"
)
number = int(number)
179769313486231590770839156793787453197860296048756011706444423684197180216158519368947833795864925541502180565485980503646440548199239100050792877003355816639229553136239076508735759914822574862575007425302077447712589550957937778424442426617334727629299387668709205606050270810842907692932019128194467627007L