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 に答える