小编Ask*_*nto的帖子

什么是迭代OrderedDict的最pythonic方式

我有一个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语句或者更优雅的迭代方式?

python dictionary loops python-2.7

27
推荐指数
1
解决办法
1万
查看次数

在C++中,如何检测该文件已被自己的进程打开?

我需要创建一个记录器工具,根据用户提供的内容从不同位置的代码输出到相同或不同的文件。如果未打开,它应该重新创建一个用于记录的文件。但它必须附加到已打开的文件中。

\n

这种天真的方式例如

\n
std::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";\n
Run Code Online (Sandbox Code Playgroud)\n

窃取流并重新创建文件。日志包含

\n
1 from f2\n
Run Code Online (Sandbox Code Playgroud)\n

使用追加,它将重用文件,但第二个打开会从f1.\nLog中窃取流

\n
1 from f1\n1 from f2 \n
Run Code Online (Sandbox Code Playgroud)\n

尝试猜测将使用哪些文件并在最开始时将它们全部打开会起作用,但可能会创建许多实际未使用的文件。

\n

打开追加并关闭每个日志记录调用将是一个几乎可行的解决方案,但由于大量的系统调用和每个日志记录操作的刷新,这似乎是一个缓慢的解决方案。

\n

我\xe2\x80\x99m 将创建一个打开文件的静态表,希望std::filesystem::canonical\n 能在我的所有情况下工作。但据我了解,这样的表应该已经存在于过程中的某个地方。

\n

我读过,在 Fortran 中,人们可以检查文件是否使用inquire.

\n

检查文件是否已经打开

\n

但这个答案并没有让我了解如何使用 \xd0\xa1/C++ 实现相同的目标。

\n
\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)

c++ file

7
推荐指数
1
解决办法
966
查看次数

标签 统计

c++ ×1

dictionary ×1

file ×1

loops ×1

python ×1

python-2.7 ×1