5

私はこのコードを持っています:

def __init__(self, a, b, c, d...):
   self.a = a
   self.b = b
   etc

私はそれを次のものに置き換えることを考えています:

def __init__(self, a, b, c, d...):
   args=locals()
   for key in args:
     self.__dict__[key] = args[key]

これは悪い考えですか?これを行うためのより良い方法はありますか?

4

4 に答える 4

9

Zen of Pythonから:シンプルは複雑よりも優れています。そして可読性が重要です。

明示的な割り当ては、マジックを使用して値を設定するよりもはるかに読みやすく、簡単です。

于 2012-06-11T01:51:36.130 に答える
2

についての@ThiefMasterのコメントに基づいてい**kwargsます:

20 個の引数を受け取る場合は、位置ではなくキーワードを使用して引数を送信するようにユーザーに要求する方が理にかなっています。20 個の引数を使用すると、コードを使用している誰かが間違った順序で引数を取得する可能性が十分にあります。

受け入れたい事前定義されたキーのリストがある場合にのみkwargs を受け入れることを検討し、それらを受け取らない場合は ValueError を発生させます。**kwargsしたがって、使用して、すべてがそこにあることを確認できます。例えば

INITIAL_ARGS = set(['a','b','c','d','e'...])

def __init__(self, **kwargs):
    if not INITIAL_ARGS.issubset(set(kwargs.iterkeys())):
        raise ValueError("Class <myclass> requires 20 keyword arguments"
                          "only given %d" % len(kwargs))
    self.__dict__.update(kwargs)

これが元のコードよりも多かれ少なかれPythonicであるかどうかはわかりませんが、コードを使用している誰かが奇妙なエラーを受け取っている理由を後で理解しようとするときに、かなりの時間を節約できるようです.

于 2012-06-11T23:28:55.397 に答える
1

巧妙なデザインよりも読みやすさを常に考慮してください。置換コードは読みやすいですか?私はおそらくそれを残すでしょう。複雑なものよりも単純なものの方が優れていることを忘れないでください。泥棒マスターが言ったように、明示的な割り当てはより読みやすくなります。

于 2012-06-11T04:17:09.217 に答える