1

我有一个简单的 csv 文件,我想用它来创建一个只计算整数值的函数。下面是代码:

def type_setter(x):                                                                                                                           
    x = list(x)                                                                                                                               
    for i in x:                                                                                                                               
        for j in i :                                                                                                                          
            print type(j)                                                                                                                     
            if isinstance(j,int)==True:                                                                                                       
                eval(j)                                                                                                                   

    return x

问题是这些j值都被视为字符串变量,而不是整数和字符串的混合。任何想法为什么会发生这种情况?

4

2 回答 2

1

所有字段都是字符串。你不能使用isinstance(j, int),因为它总是会返回False

改用str.isdigit

>>> '1234'.isdigit()
True
>>> 'abcd'.isdigit()
False
>>> '-1234'.isdigit()
False
>>> '-1234'.lstrip('-').isdigit()
True

或者创建一个使用 try-except 的辅助函数int

def is_int(x):
    try:
        int(x)
    except ValueError:
        return False
    return True

例子:

>>> is_int('1234')
True
>>> is_int('xyz')
False
>>> is_int('-1')
True
于 2013-09-15T05:05:29.303 回答
0

在 Python 中,人们应该更倾向于请求宽恕而不是允许,而不是在跳跃之前先查看

换句话说,您应该继续进行,就好像您可以将传入的令牌转换为整数并对其进行处理,而不是首先检查是否可以(例如,在您跳跃之前查看)。如果您无法进行转换,ValueError则会抛出 a ,您可以捕获并忽略它(请求宽恕部分)。

for token in tokens:
 try:
   process(int(token))
 except ValueError:
   continue

Python 文档对鸭子类型有以下说法:

鸭子打字

一种编程风格,它不查看对象的类型来确定它是否具有正确的接口;相反,方法或属性只是简单地调用或使用(“如果它看起来像鸭子,叫起来像鸭子,那它一定是鸭子。”)通过强调接口而不是特定类型,设计良好的代码通过允许多态替换。Duck-typing 避免了使用 type() 或 isinstance() 的测试。(但是请注意,duck-typing 可以用抽象基类来补充。)相反,它通常使用 hasattr() 测试或 EAFP 编程。

其中 EAFP 编程定义为:

EAFP

请求宽恕比请求许可更容易。这种常见的 Python 编码风格假设存在有效的键或属性,如果假设被证明是错误的,则捕获异常。这种干净快速的风格的特点是存在许多 try 和 except 语句。该技术与许多其他语言(如 C)常见的 LBYL 风格形成鲜明对比。

于 2013-09-15T05:34:26.363 回答