5

これは、python2.6 と python3 の両方で発生します。

class Error(Exception):
    def __init__(self, args):
            print(type(args))
            print(type(self.args)) # From BaseException
            self.args = args
            print(type(self.args))

Error("foo")

これにより、次の結果が得られます。

<type 'str'>
<type 'tuple'>
<type 'tuple'>
Error('f', 'o', 'o')

何らかの理由で、args 属性がタプルに強制されます。それがCで定義されているという事実は、それと何か関係があるのでしょうか? https://github.com/python/cpython/blob/master/Objects/exceptions.c

args 引数の名前は無関係です。それを「a」に変更しても、self.args に割り当てられている限り、同じ動作になります。

4

1 に答える 1

4

リンク先のコードを見ると、「args」属性に対して定義されたセッターがあります。BaseException_set_args を探します。これは、args のセッターとして (リンクされたコードの別の場所で) 設定されています。したがって、 を記述するときは、引数としてself.args = argsBaseException_set_args 関数を実際に呼び出していることになります。args

次に BaseException_set_args を見ると、引数をタプルに強制しています。タプルに変換できないもの (例: try ) を self.args に設定しようとするとError(23)、TypeError が返されます。

于 2012-08-14T02:45:29.153 に答える