我正在编写一个脚本,它下载到目录树(使用os.walk()),然后访问与特定文件扩展名匹配的每个文件.但是,由于我的工具将使用的某些目录树也包含子目录,而这些子目录又包含很多无用的东西(为了这个脚本的目的),我想我会为用户添加一个选项来指定要从遍历中排除的目录列表.
使用os.walk()很容易.毕竟,由我来决定我是否真的想要访问os.walk()产生的相应文件/目录,或者只是跳过它们.问题是,如果我有一个像这样的目录树:
root--
|
--- dirA
|
--- dirB
|
--- uselessStuff --
|
--- moreJunk
|
--- yetMoreJunk
Run Code Online (Sandbox Code Playgroud)
我想要排除uselessStuff及其所有子节点,os.walk()仍将下载到uselessStuff的所有(可能是数千个)子目录中,不用说,它会减慢很多东西.在一个理想的世界里,我可以告诉os.walk()甚至不会再让无用的孩子产生无用的东西了,但据我所知,没有办法做到这一点(是吗?).
有没有人有想法?也许有第三方库提供类似的东西?
分配器的工作是通过其allocate
方法获得"原始"内存.调用者在分配器返回的内存中构造的内容与分配器无关(对吗?).那么为什么std::allocator
这个模板似乎只会增加不必要的复杂性呢?分配器实际上对该类型信息做了什么?为什么必须知道内存所针对的对象类型?我假设有一些明显的原因让我失踪,那是什么原因?
考虑以下代码片段就地构建POD(普通旧数据)结构的实例:
#include <new>
#include <cassert>
#include <cstddef>
struct Test
{
int a;
char b;
double c;
};
int main()
{
const std::size_t minimumNumberOfBytes = sizeof( Test ) * 4;
// Get a block of memory that can accommodate a Test instance and then some!
void* const ptrToMemBlock = new char[ minimumNumberOfBytes ];
assert( ptrToMemBlock );
// Construct a Test instance in-place.
const Test* const testInstance( ::new ( ptrToMemBlock ) Test() );
// Is this assumption guaranteed to be true?
assert( …
Run Code Online (Sandbox Code Playgroud) 根据cppreference,std :: basic_ostringstream可以使用自定义分配器进行实例化.从C++ 11开始,允许分配器具有状态,并且我的自定义分配器类确实具有内部每实例状态(实际上每个分配器实例都有一个指向MemPool类实例的指针,它转发所有分配请求).这就是为什么我的分配器类型不能简单地默认构造并且期望工作,因为毕竟,它将从哪里获取它应该使用的MemPool实例的地址?
不幸的是,如果你看看在构造函数原型的标准:: basic_ostringstream,你可以看到,没有任何支援的建设者的实际接受一个allocator实例!我很确定std :: basic_ostringstream必须进行一些分配来构造它的结果字符串,我真的希望它使用我的分配器来做那些,但如果我没办法怎么办呢?告诉它使用哪个特定的MemPool实例?
我在这里忽略了什么吗?我觉得我必须拥有,但我肯定不会看到此刻的情况.
STL 中所有分配器感知类模板都必须使用分配器类型进行实例化。如果分配器不是模板参数而是模板 模板参数,对用户来说不是更方便吗?
为了演示,std::vector 和 std::basic_string 类模板分别具有以下签名:
template<class T, class Allocator = std::allocator<T>> class vector;
template<class CharT, class Traits = std::char_traits<CharT>, class Allocator = std::allocator<CharT>> class basic_string;
Run Code Online (Sandbox Code Playgroud)
如果我有一个自定义分配器:
template <typename T>
class MyAllocator
{
// ...
};
Run Code Online (Sandbox Code Playgroud)
并且想要实例化一个字符串向量,该向量使用我的自定义分配器为向量和字符串的内部字符数组分配内部存储,事情很快就会变得尴尬:
typedef std::vector<std::basic_string<char, std::char_traits<char>, MyAllocator<char> >, MyAllocator<std::basic_string<char, std::char_traits<char>, MyAllocator<char>>>> CustomAllocStringVector;
Run Code Online (Sandbox Code Playgroud)
使用附加的 typedef,可以稍微简化:
typedef std::basic_string<char, std::char_traits<char>, MyAllocator<char>> CustomAllocString;
typedef std::vector<CustomAllocString, MyAllocator<CustomAllocString>> CustomAllocStringVector;
Run Code Online (Sandbox Code Playgroud)
但困扰我的是,为什么强制用户显式指定分配器的完整类型?如果我将分配器用于char向量,那么不应该说分配器的类型为 allocator< char > 吗?
如果 std::vector 和 std::basic_string 的签名是:
template<typename T, template <typename ElementType> class …
Run Code Online (Sandbox Code Playgroud) 乍一看,Python的__del__
特殊方法似乎提供了析构函数在C++中具有的相同优势.但是根据Python文档(https://docs.python.org/3.4/reference/datamodel.html),无法保证您的对象的__del__
方法完全被调用!
无法保证
__del__
在解释器退出时仍然存在的对象调用()方法.
换句话说,这个方法没用!不是吗?可能会或可能不会被调用的钩子函数确实没有多大好处,因此__del__
对RAII没有任何帮助.如果我有一些必要的清理,我不需要它运行一些时间,哦,当GC感觉它真的,我需要它可靠,确定和100%的时间运行.
我知道Python提供了上下文管理器,它对于该任务更有用,但为什么要__del__
保持原样呢?重点是什么?
我们正在使用 robocopy(文件版本 5.1.10.1027)来镜像目录树。robocopy 由 python 脚本调用,而不是手动调用。我们依靠 robocopy 的退出代码来确定操作是否成功。如果成功,我们的脚本会继续做很多其他花哨的事情。否则它会立即中止。
据称,robocopy 的退出代码是一个带有以下标志的位字段(https://ss64.com/nt/robocopy-exit.html):
十六进制十进制含义如果设置
0×00 0 No errors occurred, and no copying was done.
The source and destination directory trees are completely synchronized.
0×01 1 One or more files were copied successfully (that is, new files have arrived).
0×02 2 Some Extra files or directories were detected. No files were copied
Examine the output log for details.
0×04 4 Some Mismatched files or directories were detected.
Examine the output log. Housekeeping …
Run Code Online (Sandbox Code Playgroud) 有没有人知道在Perl运行时迭代Perl程序中实际包含的所有包(即use
'd或require
'd)的方法?我已经找到了很多关于如何找到所有已安装软件包的答案,但这不是我感兴趣的.我特别希望得到一个程序实际包含的软件包列表.这有可能吗?
顺便说一句,我正在使用Perl 5.26.0.