0

我们不能检查一个值是否以字符串开头吗?

我有一个包含:

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

为什么它适用于 key 而不是 value?我该怎么做 ?任何帮助,将不胜感激

我收到错误消息:

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

3 回答 3

7

startswith方法可用于字符串对象,因此看起来attr是字符串,但value不是。

从您的编辑看来,您的价值观之一是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,那么您应该根据您从isinstance(或type)获得的内容进行过滤。

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

但是,我怀疑这会达到您的预期,因为TDCin的值my_dict不是字符串:它是您复制并粘贴的类的实例repr,因此您可能会收到类似

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

您可以通过检查valueis a来防止这种情况发生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函数,因为str它经常被重载以返回自定义值。

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