簡體   English   中英

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

[英]What is the most elegant / pythonic way of introducing large integer constants?

我需要引入大整數常量(Diffie-Hellman密鑰交換的素數)

以符合PEP8標准的方式,這種方式最狡猾/最漂亮的方式是什么? 優選地,沒有反斜杠。

我目前的做法是這樣的:

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)

PEP 8樣式指南

但最重要的是:知道何時不一致 - 有時風格指南不適用。 如有疑問,請使用您的最佳判斷。 查看其他示例並確定最佳效果。 並且不要猶豫!

所以保持原樣不變,因為它比任何其他不明顯的黑客更具可讀性

最重要的是Readability counts.很重要Readability counts.

沒有什么比Python的核心原則更重要了

但必須有一種更優雅的方式來做PRIME = int('0x {0}'。格式(N.replace('\\ n','')。replace('','')),16).. 。

如果你堅持

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

坦白說,你所擁有的是相當不錯的。 唯一明顯的變化將最終轉換:您可以刪除"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
        ''')

如果你想要一些看起來不錯的東西,也許你可以從字符串轉換為整數。 它可能不是最佳實踐,因為我從未真正看到它在實踐中使用,但我認為它比原始方法更清晰,因為轉換有限

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM