我有一个字典,其中键和值的类型是固定的。我想定义 a 中的类型TypedDict如下:
class MyTable(TypedDict):
caption: List[str]
header: List[str]
table: pd.DataFrame
epilogue: List[str]
Run Code Online (Sandbox Code Playgroud)
我有返回一个MyTable. 我想首先定义一个空(Typed)dict并填充键和值。
def returnsMyTable():
result = {}
result['caption'] = ['caption line 1','caption line 2']
result['header'] = ['header line 1','header line 2']
result['table'] = pd.DataFrame()
result['epilogue'] = ['epilogue line 1','epilogue line 2']
return result
Run Code Online (Sandbox Code Playgroud)
这里 MyPy 抱怨需要结果的类型注释。我尝试了这个:
result: MyTable = {}
Run Code Online (Sandbox Code Playgroud)
但随后 MyPy 抱怨密钥丢失了。同样,如果我定义键但将值设置为None,它会抱怨值的类型不正确。
是否可以先将 a 初始化TypedDict为空 Dict,然后再填充键和值?文档似乎表明是这样。
我想我可以首先将值定义为变量,然后MyTable再组装它们,但我正在处理要添加类型提示的遗留代码。所以我想尽量减少工作量。
我正在处理一些以我不理解的方式运行的遗留 C++ 代码。我正在使用 Microsoft 编译器,但我也尝试过使用 g++(在 Linux 上) - 相同的行为。
我有下面列出的 4 个文件。从本质上讲,它是一个记录成员列表的注册表。如果我编译所有文件并将目标文件链接到一个程序中,它会显示正确的行为:registry.memberRegistered为真:
>cl shell.cpp registry.cpp member.cpp
>shell.exe
1
Run Code Online (Sandbox Code Playgroud)
所以不知何故,member.cpp 中的代码被执行了(我不太明白,但还好)。
但是,我想要的是从 registry.cpp 和 member.cpp 构建一个静态库,并将其链接到从 shell.cpp 构建的可执行文件。但是当我这样做时,member.cpp 中的代码不会被执行并且registry.memberRegistered是假的:
>cl registry.cpp member.cpp /c
>lib registry.obj member.obj -OUT:registry.lib
>cl shell.cpp registry.lib
>shell.exe
0
Run Code Online (Sandbox Code Playgroud)
我的问题:为什么它以第一种方式工作,而不是第二种方式,有没有办法(例如编译器/链接器选项)使其与第二种方式一起工作?
class Registry {
public:
static Registry& get_registry();
bool memberRegistered;
private:
Registry() {
memberRegistered = false;
}
};
Run Code Online (Sandbox Code Playgroud)
#include "registry.h"
Registry& Registry::get_registry() {
static Registry registry;
return registry;
}
Run Code Online (Sandbox Code Playgroud)