2

このコードはPythonであり、正常に機能します。

# tests if class exists in the dictionary attrs
try:
    self.attrs['class']
# if it doesnt python will throw an exception
except KeyError:
    self.attrs['class'] = "someclass"
# else it is defined, so we concat someclass to previous value
else:
    self.attrs['class'] = "someclass %s" % self.attrs['class']

ただし、これは良い習慣ではないのではないかと思います。Pythonに更新があり、スローされた例外の名前が変更された場合、動作が停止する可能性があるためです。それは悪い習慣ですか?それを行うためのより良い方法はありますか?

4

7 に答える 7

4

必要以上に多くのルックアップがあります...この場合、おそらく次のようなことを行うことができます。

self.attrs['class'] = 'someclass %s' % self.attrs.get('class','')

これはあなたに与えるでしょう:

'someclass '

ただし、'class'キーがまだdictに含まれていない場合(これは以前とは1スペース異なります)。

于 2013-03-06T17:15:01.957 に答える
2

@mgilsonの答えは素晴らしいです。これは、おそらく理解しやすく、最後のスペースの問題を解決する別のアプローチです。

if 'class' in self.attrs:
    self.attrs['class'] = "someclass %s" % self.attrs['class']
else:
    self.attrs['class'] = "someclass"
于 2013-03-06T17:22:06.897 に答える
2

メンバーシップテストを使用できるのに、なぜ例外に依存するのですか?

# tests if class exists in the dictionary attrs
if 'class' in self.attrs:
    self.attrs['class'] = "someclass %s" % self.attrs['class']
else:
    self.attrs['class'] = "someclass"

または、少なくとも、nooptryを削除します。

# tests if class exists in the dictionary attrs
try:
    self.attrs['class'] = "someclass %s" % self.attrs['class']
except KeyError:
    self.attrs['class'] = "someclass"
于 2013-03-06T17:23:34.710 に答える
1

このコードは、成功パスで元の'class'値を2回検索するため、非効率的です。代わりにこれを試してください

try:
    v = self.attrs['class']
    self.attrs['class'] = "someclass %s" % v
except KeyError:
    self.attrs['class'] = "someclass"
于 2013-03-06T17:15:29.490 に答える
1

例外のタイプは変更されませんが、より良い解決策が2つあります。

  1. を使用できますattrs.get('class', 'someclass')。つまり、キーが見つからない場合はデフォルト値を指定します。

  2. 拡張UserDictして上書きする__missing__()

    class ListDict(UserDict):
        def __missing__(key):
            return ['someclass']
    

これにより、不足しているすべてのキーの新しいリストを自動的に作成する辞書が作成されます。これで、次のように使用できます。

self.attrs['class'].append(v)
于 2013-03-06T17:16:28.897 に答える
0

例外の名前は変更すべきではないと思いますが、辞書に対してそのようなロジックを実行する必要がある場合(存在しない場合は新しい要素を追加するため、存在する場合は更新するため)、次のように実装することもできます。以下(例です、私はそれが役立つことを願っています):

if not "class" in self.attrs:

   self.attrs['class'] = 'newclass'
else:
    self.attrs['class'] = "someclass %s" % self.attrs['class']

条件付きの最初の部分は、要素がdictのキーのリスト内にあるかどうかをチェックします。これは、一種の「イディオム」として役立つはずです。よろしく。

于 2013-03-06T17:24:21.573 に答える
0

自分でattrsディクショナリを作成している場合は、DefaultDictを使用できます。

from collections import defaultdict

attrs = defaultdict(str)

attrs['class'] = "someclass %s" % attrs['class']
于 2013-03-06T17:24:41.773 に答える