寻找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;否?1
AssetBundle.loadString()
返回一个
Future
。从技术上讲,没有什么可以阻止
loadString()
同步并立即返回一个已经完成的
Future
并返回结果,但这将是愚蠢的,并将首先挫败返回
Future
的目的。2.如果你想迭代一个
映射
,你可以很容易地进行迭代。你不能将
映射
传递给
未来。等待
是因为
未来。等待
期望
可重用
的每个元素都是
未来
映射的每个“元素”由两个对象组成:一个键和一个值。现在,这些值中的每一个都可能是
未来
s(在这种情况下,您可以执行
未来.wait(map.values)
,这基本上就是我在上面的示例代码中所做的),但这是一个特殊情况。Super。我有两个快速续集。1-这很管用,但太像魔术了。当我使用
rootBundle.loadString('assets/file\n.txt')
格式的
Map
中的每个值调用
myFutureWait
时,是什么阻止这两个值在定义映射时执行?如果它们确实在调用点执行,那么当它们还没有包装在
未来时,它又如何工作呢?2-我不能使用地图的真正原因是Dart中的地图(当然是出于某些原因)不是Iterable,而列表是Iterable;否?1
AssetBundle.loadString()
返回一个
Future
。从技术上讲,没有什么可以阻止
loadString()
同步并立即返回一个已经完成的
Future
并返回结果,但这将是愚蠢的,并将首先挫败返回
Future
的目的。2.如果你想迭代一个
映射
,你可以很容易地进行迭代。你不能将
映射
传递给
未来。等待
是因为
未来。等待
期望
可重用
的每个元素都是
未来
映射的每个“元素”由两个对象组成:一个键和一个值。现在,这些值中的每一个都可能是
Future
s(在这种情况下,您可以执行
Future.wait(map.values)
,这基本上就是我在上面的示例代码中所做的),但这是一种特殊情况。