我有一个简单的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
值都被视为字符串变量,而不是整数和字符串的混合。有没有想过为什么会这样?
答案 0 :(得分: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
答案 1 :(得分:0)
在Python中,人们应该倾向于更好地请求宽恕而不是许可而不是在跳跃之前看起来。
换句话说,你应该继续进行,好像你可以将传入令牌转换为整数并处理它,而不是先检查你是否可以(例如在你跳跃之前看)。如果您无法进行转化,则会抛出ValueError
,您可以抓住并解散(请求原谅部分)。
for token in tokens:
try:
process(int(token))
except ValueError:
continue
Python文档有关于duck typing的以下内容:
<强>鸭打字强>
一种编程风格,它不会查看对象的类型 确定它是否具有正确的界面;相反,方法或 简单地调用或使用属性(“如果它看起来像鸭子和 像鸭子一样呱呱叫,它一定是鸭子。“)强调界面 而不是特定的类型,精心设计的代码改进了它 允许多态替换的灵活性。鸭子打字避免 使用type()或isinstance()进行测试。 (但请注意,鸭子打字 可以用抽象基类来补充。)相反,它通常是 采用hasattr()测试或EAFP编程。
EAFP编程定义为:
<强> EAFP 强>
比获得许可更容易请求宽恕。这个常见的Python 编码风格假定存在有效的键或属性 如果假设被证明是假的,则捕获异常。这干净又快 风格的特点是存在许多尝试和除外 声明。该技术与许多人共同的LBYL风格形成鲜明对比 其他语言,如C.