【发布时间】:2017-06-18 06:43:14
【问题描述】:
在 C++ 和 C# 等中,您可以重载或调整返回类型以匹配输入类型。使用 Python,我发现返回类型无论如何都应该是一致的引用。 Like in this question
现在我的代码想要将返回类型与参数类型匹配
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 多行理解行。但如果这太奇怪了,那就这样吧。
这归结为违反关于 1 个函数 1 个返回类型的不成文规则的可读性。
【问题讨论】:
-
如果您对参数了解不够,无法知道是否将其传递给
strUpper、listUpper或dictUpper,那么您不知道您从@ 得到什么987654328@反正。 -
这是真的。为了集中注意力,我知道我可以测试输入类型的所有方法。我选择得到宽恕而不是许可。我可以猜测字符串更常见,而字典和列表是最不期望的。我的问题是针对常见的图书馆内部功能。我什至可以使用一个类来隐藏对我来说无关紧要的特定类型版本。问题是函数应该只有一种返回类型的论点有多强。在这种情况下,您会取回与您传入的内容相关的内容。
-
有 Python 函数可以返回多种类型的值,但它们往往分为两类。 1)
f将返回t类型的值,或者将返回None。 2) 函数将返回t类型的值,但任何此类类型都将支持迭代/映射/等。返回一个唯一识别特征是匹配输入类型的值只是推迟了最终需要弄清楚你得到了什么类型的值.... -
...也就是说,您的示例可以解释为遵循我的第二点;由于您使用每个值作为
print的参数,您可能会假设myUpper返回一个支持__str__(或至少__repr__)的值。但为了清楚起见,我强烈主张一个函数应该有一个独立于其输入类型的单一、明确定义的返回类型。 -
你不认为知道调用类型就足以知道返回类型吗?这就是重点。你认为这还不够清楚。或者它太不同而无法使用?
标签: python return-type