我有一个适用于list
和dict
的函数:
def row2tuple (row, md):
return (row[md.first], row[md.next])
如果row
是list
,那么md.first
和md.next
将是int
,如果row
是dict
},它们将是str
ings。
但是,如果row
为dict
并且字段丢失,则会导致错误。如果我使用get
方法:
def row2tuple (row, md):
return (row.get(md.first), row.get(md.next))
它完全符合我对dict
的要求,但它对list
s根本不起作用。
我当然可以做到
def row2tuple (row, md):
if isinstance(row,list):
return (row[md.first], row[md.next])
return (row.get(md.first), row.get(md.next))
但它看起来很难看。
有更多的pythonic /简明方法吗?
答案 0 :(得分:1)
写一个"安全查找"函数如this question中所述,并使用它来进行查找。知道LookupError
是KeyError
和ValueError
的超类是很有用的,因此您可以通过捕获LookupError
来捕获列表或字典上的缺失索引:
def safeLookup(container, index):
try:
return container[index]
except LookupError:
return None
def makeTuple(container, indices):
return tuple(safeLookup(container, index) for index in indices)
然后:
>>> makeTuple([1, 2, 3], [0, 2, 4])
(1, 3, None)
>>> makeTuple({'x': 1, 'y': 2, 'z': 3}, ['x', 'z', 'hoohah'])
(1, 3, None)
答案 1 :(得分:0)
根据perms
方式,请求宽恕比获得更容易。因此,如果您确定只是处理这两种类型的对象(EAFP
和list
)作为更加pythonic的方式,则可以使用dict
表达式:
try-except
答案 2 :(得分:0)
我认为你所拥有的是好的,但如果你喜欢这里是一个(通常如此)更简洁的选择:
rails new projectName