寻找Python dict的安全翻译作为Dart的返回类型
偶尔,我们都需要从函数中快速返回多个值,并寻找一种动态创建新类型的方法寻找Python dict的安全翻译作为Dart的返回类型,dart,return-type,type-safety,Dart,Return Type,Type Safety,偶尔,我们都需要从函数中快速返回多个值,并寻找一种动态创建新类型的方法 def get_trio3(): return {"b": True, "i": 23, "s": "no"} r = get_trio3() print(r["i"]) print(r["s"]) 在Python中,我可以返回一个元组 def get_trio1(): return
def get_trio3():
return {"b": True, "i": 23, "s": "no"}
r = get_trio3()
print(r["i"])
print(r["s"])
在Python中,我可以返回一个元组
def get_trio1():
return (True, 23, "no")
(_, first1, second1) = get_trio1()
print(first1)
print(second1)
忽略其中一个值,并在一个赋值中动态检索另外两个值
我同样可以返回一个数组
def get_trio2():
return [True, 23, "no"]
[_, first2, second2] = get_trio2()
print(first2)
print(second2)
但这两者都是脆弱的。如果我编辑代码来添加一个值,特别是如果它在已经定义的三个值内,修改后的代码可能会无声地失败
这就是为什么最好的解决方案是动态创建一个dict
def get_trio3():
return {"b": True, "i": 23, "s": "no"}
r = get_trio3()
print(r["i"])
print(r["s"])
使用命名成员意味着维护代码相当安全
我能做的最接近于在Dart中获得相同安全性的事情是什么?是否需要为返回类型定义类
如果有关系,返回未来时,上下文将避免列表
Future<List<dynamic>> loadAsset() async =>
return await Future.wait([
rootBundle.loadString('assets/file1.txt'),
rootBundle.loadString('assets/file2.txt'),
]);
使用地图
Map<String, dynamic> foo() => {'A': 'a', 'B': 'b', 'C': false }
var result = foo();
print result['B']; // prints b;
Map foo()=>{'A':'A','B':'B','C':false}
var result=foo();
打印结果['B'];//印刷品b;
使用地图
Map<String, dynamic> foo() => {'A': 'a', 'B': 'b', 'C': false }
var result = foo();
print result['B']; // prints b;
Map foo()=>{'A':'A','B':'B','C':false}
var result=foo();
打印结果['B'];//印刷品b;
您的loadAsset
函数返回一个未来
,因为这就是您声明它的方式。您可以将其声明为返回一个Future
Future.wait
硬连线为使用阵列
def get_trio2():
return [True, 23, "no"]
[_, first2, second2] = get_trio2()
print(first2)
print(second2)
特别是因为Dart是一种静态类型的语言,所以您不能期望它同时使用列表
和一些带有自定义语义的映射
。您可以编写自己的版本:
Future myFutureWait(映射futuresMap)异步{
var keys=futuresMap.keys.toList();
var values=futuresMap.values.toList();
var结果=等待未来。等待(值);
返回Map.fromIterables(键、结果);
}
您的loadAsset
函数返回一个未来
,因为这就是您声明它的方式。您可以将其声明为返回一个Future
Future.wait
硬连线为使用阵列
def get_trio2():
return [True, 23, "no"]
[_, first2, second2] = get_trio2()
print(first2)
print(second2)
特别是因为Dart是一种静态类型的语言,所以您不能期望它同时使用列表
和一些带有自定义语义的映射
。您可以编写自己的版本:
Future myFutureWait(映射futuresMap)异步{
var keys=futuresMap.keys.toList();
var values=futuresMap.values.toList();
var结果=等待未来。等待(值);
返回Map.fromIterables(键、结果);
}
Cool。。就这样。您能否确认这实际上不适用于Future。请稍候?我用你的答案更新了问题。酷。。就这样。您能否确认这实际上不适用于Future。请稍候?我用你的答案更新了问题。超级。我有两个快速续集。1-这很管用,但太像魔术了。当我使用rootBundle.loadString('assets/file\n.txt')
格式的Map
中的每个值调用myFutureWait
时,是什么阻止这两个值在定义映射时执行?如果它们确实在调用点执行,那么当它们还没有包装在未来时,它又如何工作呢?2-我不能使用地图的真正原因是Dart中的地图(当然是出于某些原因)不是Iterable,而列表是Iterable;否?1AssetBundle.loadString()
返回一个Future
。从技术上讲,没有什么可以阻止loadString()
同步并立即返回一个已经完成的Future
并返回结果,但这将是愚蠢的,并将首先挫败返回Future
的目的。2.如果你想迭代一个映射
,你可以很容易地进行迭代。你不能将映射
传递给未来。等待
是因为未来。等待
期望可重用
的每个元素都是未来
。映射的每个“元素”由两个对象组成:一个键和一个值。现在,这些值中的每一个都可能是未来
s(在这种情况下,您可以执行未来.wait(map.values)
,这基本上就是我在上面的示例代码中所做的),但这是一个特殊情况。Super。我有两个快速续集。1-这很管用,但太像魔术了。当我使用rootBundle.loadString('assets/file\n.txt')
格式的Map
中的每个值调用myFutureWait
时,是什么阻止这两个值在定义映射时执行?如果它们确实在调用点执行,那么当它们还没有包装在未来时,它又如何工作呢?2-我不能使用地图的真正原因是Dart中的地图(当然是出于某些原因)不是Iterable,而列表是Iterable;否?1AssetBundle.loadString()
返回一个Future
。从技术上讲,没有什么可以阻止loadString()
同步并立即返回一个已经完成的Future
并返回结果,但这将是愚蠢的,并将首先挫败返回Future
的目的。2.如果你想迭代一个映射
,你可以很容易地进行迭代。你不能将映射
传递给未来。等待
是因为未来。等待
期望可重用
的每个元素都是未来
。映射的每个“元素”由两个对象组成:一个键和一个值。现在,这些值中的每一个都可能是Future
s(在这种情况下,您可以执行Future.wait(map.values)
,这基本上就是我在上面的示例代码中所做的),但这是一种特殊情况。