繁体   English   中英

Python调整返回类型以考虑输入类型

[英]Python adjust the return type to consider the input types

在C ++和C#及其他版本中,您可以重载或调整返回类型以匹配输入类型。 我使用Python找到了无论返回值都应该一致的引用。 喜欢这个问题

现在对于我想要将返回类型与参数类型匹配的代码

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

那么这条python的罪恶有多严重? 我大部分时间仍在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多个理解行。 但是,如果这太奇怪了,那就这样吧。

归结为关于1个功能1返回类型的不成文规则的可读性ver违反。

如果您希望返回参数与参数(确切地说是第一个参数)保持一致,则可以使用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

把我的五分钱放在那里:

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)

实际上,您可以检查类型,而不是依赖异常。

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

您可以使用isinstance并将字典的键/值以及列表项递归传递给该函数将处理更多类型:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM