2016-05-14 11 views
1

Python初心者はここにあります。 EclipseでPyDevを使用します。MoneyとTypeError:__init __()は1から2の位置引数をとりますが、3が与えられました

私は銀行取引を処理するプログラムを作成しています。私は、Moneyパッケージ(1.3.0)を使用します。私はon this pageを示すように、あなたは(マネーの通貨プリセットバリアントを作成することができることを学んだまで、プログラムがうまく働いた

私はお金を使う際に切り取ら以下の罰金に動作しますが、それは私が私のUSDプリセットを使用し、エラーを与える:。

from money import Money 
class USD(Money): 
    def __init__(self, amount='0'): 
     super().__init__(amount=amount, currency='USD') 
a = Money(0,'USD') 
b = Money(-360,'USD') 
a += b 
print(a) 
c = USD(0) 
d = USD(-360) 
c += d 
print(c) 

(印刷()文の真の目的は、ブレークポイントを設定するのに便利な場所です。)

私はこのエラーを取得する:

File "D:\Dev\mymoney\mymoney.py", line 11, in <module> 
    c += d 
File "C:\Program Files\Python35\lib\site-packages\money\money.py", line 119, in __add__ 
    return self.__class__(amount, self._currency) 
TypeError: __init__() takes from 1 to 2 positional arguments but 3 were given 

私のコードを修正して正しく動作するようにしたいのですが、問題の内容を理解する必要があります。後者については、あなたの説明か、私が学ぶことができるドキュメンテーションの何かへのポインタが役に立つでしょう。 source code hereで定義された__add__方法では、新しいクラスが__init__amountself._currencyの両方を渡して返されるため

答えて

1

です。

def __add__(self, other): 
    if isinstance(other, Money): 
     if other.currency != self._currency: 
      raise CurrencyMismatch(self._currency, other.currency, '+') 
     other = other.amount 
    amount = self._amount + other 
    return self.__class__(amount, self._currency) 

ただし、通貨プリセットサブクラスは通貨ではなく金額を消費します。したがって、あなたはあまりにも多くのポジション引数を渡しています。あなたの選択肢は通貨プリセットのMoneyサブクラス化しないようになり

(私の勧告を、私はポイントの多くが表示されない)、そのサブクラスのために、それぞれの通貨に設定されたデフォルトのパラメータを受け入れるために、あなたのサブクラスの__init__方法を変更します__add__のようなメソッドをオーバーライドして、__init__に通貨引数を渡さないでください。代わりに、return self.__class__(amount)のようなものがあります。しかし後者をしないでください、それは必要ではありません。

+0

私がやっていることはドキュメントに正確に従っているので、私はバグとして報告しようと決めました。私はこれが既知の問題であることを知りました。 https://github.com/carlospalol/money/issues/19を参照してください。問題20は、単一通貨サブクラスのサポートを改善するための提案です。私は自分自身で修正を提出するのに十分な知識がないので、私は物事を単純に保ち、今は非サブクラスのアプローチを使用します。 –

+0

__init__関数が問題であるとメッセージが話していることは、私には困惑しています。それが指すコード行は__class__を持つ戻り値です。私はまだPythonでクラスを勉強していませんが、__class__という表記法はおそらく__init__関数を呼び出すクラスの新しいインスタンスを作成することを指しています。それは正しいのでしょうか? –

+0

これは正確に正しい、yes :)、 '+ ='はクラスのために '__add__'を呼び出します。サブクラスではオーバーライドされません。 – miradulo

関連する問題