は、私は、親クラスの代わりにクラスメソッドでsuper()
を使用することができなければならない:configparserコンストラクタでsuper()を使用できないのはなぜですか? Pythonの3で
class demodict(OrderedDict):
def __setitem__(self, key, val):
print(key)
super().__setitem__(self, key, val)
上記挙動Iはdemodict()
をインスタンス化し、それに値を追加するとき、期待どおり。しかし、私はConfigParser
オブジェクトのデータ型としてそれを使用する場合、何かがうまくいかない:
>>> Config = configparser.ConfigParser(dict_type=demodict)
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
conf = configparser.ConfigParser(dict_type=demodict)
File ".../anaconda/lib/python3.4/configparser.py", line 588, in __init__
self._proxies[default_section] = SectionProxy(self, default_section)
File "<pyshell#14>", line 5, in __setitem__
super().__setitem__(self, key, val)
File ".../anaconda/lib/python3.4/collections/__init__.py", line 67, in __setitem__
if key not in self:
TypeError: unhashable type: 'demodict'
私は、親クラスとして平野dict
とOrderedDict
を交換した場合、エラーも奇妙取得:
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
conf = configparser.ConfigParser(dict_type=demodict)
File ".../anaconda/lib/python3.4/configparser.py", line 588, in __init__
self._proxies[default_section] = SectionProxy(self, default_section)
File "<pyshell#7>", line 6, in __setitem__
super().__setitem__(self, key, val)
TypeError: expected 2 arguments, got 3
super()
の代わりにOrderedDict
またはdict
を明示的に書き込む場合は、dict_type
としてdemodict
を問題なく使用できます。誰かが何が起こっているか説明できますか? (簡単な回避策があるので、解決策よりも原因についてもっと興味があります...)
'super().__ setitem__は自動的に第1引数として' self'を渡します。 'super().__ setitem __(key、val)'を実行するだけで動作します。 – vaultah
確かに!それが問題を解決しました。ダーだけでなく、どのように奇妙。私は 'super()'のドキュメントをもっと慎重に読んでいたはずです。あなたは解説として解答としてそれを書いてもらえますか? – alexis
私はポイントを惜しみませんが、なぜ誰かがこれが悪い質問であると思うのは不思議です。 – alexis