2013-07-17 82 views
0
开头

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

我有一个包含字典:

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' 
+0

'my_dict'的内容是什么? –

+4

'value'必须是一个字符串或其他具有'startswith'方法的对象。请检查您的值的类型。 – kwatford

+0

也许,如果这正是您正在运行的内容,因为已经键入了'<__ main'',并且'value'与您的'if'子句不在同一个范围内。 – Rubens

回答

6

startswith method is available for string objects,所以它看起来像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 
+0

有没有办法动态地做到这一点?我应该遍历'my_dict'并测试'value == None'? – salamey

+0

如果你想跳过'None'值(或者一般的非字符串类型),那么是的,你可以检查。我将在一个示例中进行编辑。 – jh314

0

发生的原因问题my_dict['backlog_month_done']None

您可以在您如果使用额外的条件解决:

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 

不过,我怀疑这会做你所期望的,作为在my_dictTDC值不是一个字符串:它是一个实例你已经拷贝和粘贴类的repr,所以你可能会得到这样的

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

消息您可以检查防止通过检查valuestr

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经常被重载以返回自定义值。

​​
+1

问题是'TDC'只是一个例子,而且我的字典包含了很多以'<__ main'开头的值,所以我想动态地执行它.... – salamey

+0

@ user1734229在这种情况下,您需要转向他们成字符串。将在上面编辑。 – RoadieRich

+0

@ user1734229已编辑,但你真的想考虑这是否是正确的方式来做你想做的事情。在实际代码中使用'repr'通常被认为是“代码味道”。看看还有哪些规则定义了你想删除的值。 – RoadieRich

1

if value.startswith('<__main') :

此代码可能旨在发现<__main__.TDC object at 0x010F47D0>但它不工作,因为你的dict包含None值,您看到的<__main__.TDC object at 0x010F47D0>仅仅是对象的文本repr esentation,但它不是一个字符串。

如果您确定您确实需要这样的异构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