0

値が文字列で始まるかどうかを確認できませんか?

次を含むdictがあります:

my_dict = {'category': 'failure', 'logged_product': 'log_prd1', 'product': 'prd1', 'backlog_month_done': None,'TDC': <__main__.TDC object at 0x010F47D0>}

for attr, value in my_dict.items() :
    if value.startswith('<__main') :
    #removeit

値ではなくキーで機能するのはなぜですか? どうすればできますか?任意の助けをいただければ幸いです

エラーが発生しています:

AttributeError: 'NoneType' object has no attribute 'startswith'
4

3 に答える 3

7

このstartswithメソッドは文字列オブジェクトで使用できるため、文字列attrのように見えますが、そうでvalueはありません。

編集から、値の 1 つが のように見えますNone。修正するには、これを次のように変更する必要がありますmy_dict

'backlog_month_done': None

これに:

'backlog_month_done': ''

valueが文字列型かどうかを確認することもできます。

for attr, value in my_dict.items() :
    if not isinstance(value, basestring):
        continue
    if value.startswith('<__main') :
    #removeit
于 2013-07-17T13:47:14.647 に答える
1

value.startswith('<__main') の場合:

このコードは検索するように設計されている可能性があり<__main__.TDC object at 0x010F47D0>ますが、値dictが含まれており、表示される は単にオブジェクトのテキスト表現であり、文字列ではないため、機能しません。None<__main__.TDC object at 0x010F47D0>repr

そのような異質な が本当に必要であると確信している場合は、代わりに(または)dictから取得したものに基づいてフィルター処理する必要があります。isinstancetype

for attr, value in my_dict.items() :
    if not isinstance(value, basestring) :
        continue # if you really want to remove it, use del my_dict[attr] here instead
于 2013-07-17T13:58:39.880 に答える
0

問題が発生する理由my_dict['backlog_month_done']Noneです。

これは、if で追加の条件を使用して修正できます。

my_dict = {'category': 'failure', 'logged_product': 'log_prd1', 'product': 'prd1', 'backlog_month_done': None,'TDC': <__main__.TDC object at 0x010F47D0>}

for attr, value in my_dict.items() :
    if value and value.startswith('<__main'):
        #removeit

TDCただし、 in の値は文字列ではないため、これが期待どおりに機能するとmy_dictは思えません。これは、コピーして貼り付けたクラスのインスタンスであるreprため、次のようなメッセージが表示される可能性があります。

AttributeError: 'TDC' object has no attribute 'startswith'

チェックすることでそれを防ぐことができvalueますstr

for attr, value in my_dict.items() :
    if isinstance(value, str) and value.startswith('<__main'):
        #removeit

ただし、それはあなたが望んでいるものではないと思います。値が TDC のインスタンスであるかどうかを確認する場合はTDC、引数としてに渡す必要がありisinstanceます。

for attr, value in my_dict.items() :
    if isinstance(value, TDC):
        #removeit

または、"<__main" で始まるもの (repr を含む) を削除したい場合は、アイテムの文字列を取得する必要があります。この場合、カスタム値を返すために頻繁にオーバーロードされるため、repr関数を使用することをお勧めします。str

for attr, value in my_dict.items() :
    if repr(value).startswith('<__main'):
        #removeit
于 2013-07-17T13:58:07.500 に答える