引入大整数常量的最优雅/最具Python风格的方式是什么?

引入大整数常量的最优雅/最具Python风格的方式是什么?,python,coding-style,pep8,Python,Coding Style,Pep8,我需要引入大整数常量(Diffie-Hellman密钥交换的素数) 以符合PEP8的方式实现这一点的最具pythonic/pretty方式是什么?最好没有反斜杠 我目前的做法是: N = '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F

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

以符合PEP8的方式实现这一点的最具pythonic/pretty方式是什么?最好没有反斜杠

我目前的做法是:

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)

但最重要的是:知道什么时候应该前后矛盾——有时是矛盾 样式指南不适用。当有疑问时,运用你的最佳判断。 看看其他的例子,并决定什么看起来最好。不要犹豫 问

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

最重要的是,可读性很重要。

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

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

如果你坚持

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

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

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

坦率地说,你所拥有的相当不错。唯一明显的变化是您的最终转换:您可以删除
“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
        ''')

+1-但是必须有一种更优雅的方法来做
PRIME=int('0x{0})。格式(N.replace('\N','').replace('''')),16)
…实际上,我自己发现
int(re.sub('\s+','',N),16)
并不优雅/顺便提一下,我的评论是针对Abhijit的
PRIME=long…
,非
re.sub
<0xFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B1B0A6DF25F14374FE1356D65C245E485B57625EC6F44C42E9A67ED6BFF5CB6F406B7EDE86BFA899F5AE9F24117C46486651FFF代码将是,但是你的<代码> n>代码>要漂亮得多。你可以考虑查看源代码的人如何使用常量。不管你怎么写,他们都不会在他们的头脑中验证它是首要的。因此,他们真正“读取”它的唯一方式可能是将它复制到其他代码中,或者复制到Mathematica中以验证其属性,或者其他任何东西。那么,也许您应该针对该用例进行优化。也就是说,使用不漂亮的解决方案
PRIME=1797…
。请记住,在正确性之后,源代码的主要目的不是为了美观,而是为了对读者有用。但是,除了其他以外,我更喜欢
'.join(N.split())
N.replace('\N','')。replace(''''),
我会将该值放入文本文件中,并用python读取它。问题解决了。您也可以将
int
放在原始作业中。