0

次のエラーが発生する理由がわかりません。アドバイスをいただければ幸いです。ありがとう。

エラー:

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    ciphertext = md.encrypt(plaintext)
  File "/Volumes/Mac/Computer/Programming/Cryptography/crypto.py", line 87, in encrypt
    ciphertext = Text()
TypeError: __init__() takes exactly 2 arguments (1 given)

コード:

import crypto

plaintext = crypto.Text('plaintext.txt')
md = crypto.MonomeDinome('fred', 'wilma')
ciphertext = md.encrypt(plaintext)
print ciphertext

Crypto.py には次のコードがあります。

class Text:
    def __init__(self, filename):
        self.load(filename)

    def load(self, filename):
        fp = open(filename, "r")
        self.rawtext = fp.read()
        fp.close
        self.text = self.convert(self.rawtext)

    def convert(self, txt):
        rval = ""
        for c in txt.upper():
            if c.isalpha():
                rval += c
        return rval

    def set(self, lst):
        self.text = "".join(lst)

    def get(self):
        return self.text

    def __str__(self):
        rval = ""
        pos = 0
        for c in self.text:
            rval += c
            pos += 1
            if pos % 60 == 0:
                rval += '\n'
            elif pos % 5 == 0:
                rval += " "
        return rval

class MonomeDinome:
    def __init__(self, dkw, lkw):
        self.digitsKey = self.digitsScramble(dkw)
        self.lettersKey = self.lettersScramble(lkw)

    def digitsScramble(self, dkw):
        dkl = list((dkw.upper() + "ZZZZZZZZZZ")[0:10])

        for i in "0123456789":
            pos = self.findLowestLetter(dkl)
            if pos != -1:
                dkl[pos] = i

        return "".join(dkl)

    def findLowestLetter(self, lst):
        pos = -1
        lowest = ''

        for i in range(len(lst)):
            if lst[i].isalpha():
                if (lowest == '') or (lst[i] < lowest):
                    lowest = lst[i]
                    pos = i
        return pos

    def lettersScramble(self, lkw):
        rlist = []
        for a in lkw.upper():
            if a == "W":
                a = "V"
            if a == "J":
                a = "I"
            if not a in rlist:
                rlist.append(a)

        for a in "ABCDEFGHIKLMNOPQRSTUVXYZ":
            if not a in rlist:
                rlist.append(a)

        return "".join(rlist)

    def __str__(self):
        return "digitsKey = " + self.digitsKey + "\n" + \
                "lettersKey = " + self.lettersKey

    def encrypt(self, plaintext):
        rlist = []
        for char in plaintext.get():
            rlist.append(char)
        ciphertext = Text()
        ciphertext.set(rlist)
        return ciphertext
4

2 に答える 2

4

コンストラクターへのfilename引数はオプションではないため、encryptこれは失敗します: ciphertext = Text(). それはする必要があります... = Text(some_filename)

于 2013-03-03T01:44:21.130 に答える
2

Text0 または 1 つのオプション引数を取りたいと思います。

class Text:
    def __init__(self, filename=None):
        if filename is not None:
            self.load(filename)

私は信じている

    ciphertext = Text()

理にかなっている

    ciphertext.set(rlist)

ciphertext.textメソッドを呼び出すのではなく、を設定する別のload方法です。


ちなみに、以下にもエラーがありますload

def load(self, filename):
    ...
    fp.close()   # <--- You need parentheses or else the closed method is not called

with次の構文を使用すると、エラーを回避できます。

def load(self, filename):
    with open(filename, "r") as fp:
        self.rawtext = fp.read()
    self.text = self.convert(self.rawtext)

このwith構文では、 Python が-suitefpを離れると、ファイルハンドル が自動的に閉じられます。with

于 2013-03-03T01:48:43.653 に答える