我有一个OrderedDict,在循环中我想得到索引,键和值.这肯定可以通过多种方式完成,即
a = collections.OrderedDict({…})
for i,b,c in zip(range(len(a)), a.iterkeys(), a.itervalues()):
…
Run Code Online (Sandbox Code Playgroud)
但我想避免范围(len(a))并将a.iterkeys(),a.itervalues()缩短为类似a.iteritems()的东西.使用枚举和iteritems,可以将其改写为
for i,d in enumerate(a.iteritems()):
b,c = d
Run Code Online (Sandbox Code Playgroud)
但它需要在循环体内解包.有没有办法解析for语句或者更优雅的迭代方式?
我需要创建一个记录器工具,根据用户提供的内容从不同位置的代码输出到相同或不同的文件。如果未打开,它应该重新创建一个用于记录的文件。但它必须附加到已打开的文件中。
\n这种天真的方式例如
\nstd::ofstream f1(\xe2\x80\x9clog\xe2\x80\x9d);\nf1 << "1 from f1\\n";\nstd::ofstream f2(\xe2\x80\x9clog\xe2\x80\x9d);\nf2 << "1 from f2\\n";\nf1 << "2 from f1\\n";\nRun Code Online (Sandbox Code Playgroud)\n窃取流并重新创建文件。日志包含
\n1 from f2\nRun Code Online (Sandbox Code Playgroud)\n使用追加,它将重用文件,但第二个打开会从f1.\nLog中窃取流
1 from f1\n1 from f2 \nRun Code Online (Sandbox Code Playgroud)\n尝试猜测将使用哪些文件并在最开始时将它们全部打开会起作用,但可能会创建许多实际未使用的文件。
\n打开追加并关闭每个日志记录调用将是一个几乎可行的解决方案,但由于大量的系统调用和每个日志记录操作的刷新,这似乎是一个缓慢的解决方案。
\n我\xe2\x80\x99m 将创建一个打开文件的静态表,希望std::filesystem::canonical\n 能在我的所有情况下工作。但据我了解,这样的表应该已经存在于过程中的某个地方。
我读过,在 Fortran 中,人们可以检查文件是否使用inquire.
但这个答案并没有让我了解如何使用 \xd0\xa1/C++ 实现相同的目标。
\n更新
\n带有打开日志的“静态”表的记录器的划痕可能看起来像
\n//hpp\nclass Logger {\n static std::mutex _mutex;\n static std::unordered_map<std::string, std::ofstream> _openFiles;\n std::ostream& _appender;\n std::ostream& _createAppender(const std::filesystem::path& logPath);\npublic:\n …Run Code Online (Sandbox Code Playgroud)