在C ++和C#等中,您可以重载或调整返回类型以匹配输入类型。使用Python我发现返回类型应该是一致的引用。 Like in this question
现在我的代码想要将返回类型与param类型匹配
def myUpper(what_is_this_thing):
try:
return what_is_this_thing.upper()
except AttributeError:
try:
return {k:what_is_this_thing[k].upper() for k in what_is_this_thing}
except TypeError:
return [x.upper() for x in what_is_this_thing]
print myUpper('test')
print myUpper(['test', 'and more'])
print myUpper({'one':'test', 'two': 'and more'})
print myUpper(['test', 1000])
输出
TEST
['TEST', 'AND MORE']
{'two': 'AND MORE', 'one': 'TEST'}
An exception is rased because the payload does not have a upper method
这个蟒蛇犯罪有多糟糕?我大部分仍然在2.7工作我知道3.3有类型提示,学习需要等到夏天晚些时候。
任何人都有一种不那么罪恶的方式来获得大部分的好处?还是一个连贯的论点,为什么不应该这样做?
附录:
除了我喜欢的Python3 Moses。我觉得有必要找到这个问题是否最好用python 2.7
def myUpper(s):
return s.upper()
print myUpper('test')
print [s.myUpper() for s in 'test', 'and more'] d = { 'one':'test', 'two': 'and more'}
print {k:d[k].myUpper() for k in d}
总结传播理解的东西在代码中即使很常见。选择理解的扩散而不是模糊的返回数据类型?
我怀疑如果我通过调整返回类型来删除最终代码中的400多条理解线。但如果这太奇怪了,那就这样吧。
归结为可读性ver违反了关于1个函数1返回类型的未写规则。
答案 0 :(得分:3)
如果您希望将返回类型与参数(确切地说,第一个参数)保持一致,则可以使用functools.singledispatch
创建函数的重载实现;我之所以说你开始转向Python 3的原因之一是:
from functools import singledispatch
@singledispatch
def my_upper(what_is_this_thing):
return what_is_this_thing.upper()
@my_upper.register(list)
def _(this_is_a_list):
...
return this_is_also_a_list
@my_upper.register(dict)
def _(this_is_a_dict):
...
return this_is_also_a_dict
答案 1 :(得分:1)
把我的五美分放在那里:
hanlders = {
str: (lambda what_is_this_thing: what_is_this_thing.upper()),
dict: (lambda what_is_this_thing: {k:what_is_this_thing[k].upper() for k in what_is_this_thing}),
list: (lambda what_is_this_thing: [x.upper() for x in what_is_this_thing]),
}
print handlers[type(what_is_this_thing)](what_is_this_thing)
答案 2 :(得分:0)
您实际上可以检查类型而不是依赖例外。
v = 'one'
if type(v) == str:
# Treat it as a string
elif type(v) == list:
# Treat it as a list
elif type(v) == dict:
# Treat is as a dict
答案 3 :(得分:0)
你可以使用isinstance
- 并且将dict的键/值以及递归的列表项传递给函数将处理更多类型:
def myUpper(o):
if(isinstance(o, str)):
return o.upper()
elif(isinstance(o, list)):
return [myUpper(x) for x in o]
elif(isinstance(o, dict)):
return {myUpper(k):myUpper(v) for k,v in o.items()}
else:
return o