小编Ste*_*fan的帖子

具有多个'if'的python列表理解

我们都知道python的

[f(x) for x in y if g(x)]
Run Code Online (Sandbox Code Playgroud)

句法.

但是 ,列表推导的AST表示有多个'if'表达式的空间:

comprehension = (expr target, expr iter, expr* ifs)
Run Code Online (Sandbox Code Playgroud)

有人能给我一个python代码的例子,它会产生一个带有多个'if'表达式的AST吗?

python if-statement list-comprehension

37
推荐指数
4
解决办法
4万
查看次数

"自由线程"和"线程安全"之间的区别

有时我会看到术语"自由线程"来描述一个类或一个方法.它似乎与"线程安全"具有相似或相同的含义.

这两个术语有区别吗?

multithreading thread-safety

29
推荐指数
2
解决办法
6645
查看次数

如何返回指针(和所有权)的向量C++ 11

我有一个工厂方法,它创建一堆对象并返回指向它们的指针.对象的所有权转移给调用者:

std::vector<animal*> create_zoo();
Run Code Online (Sandbox Code Playgroud)

这有效,但容易出现内存泄漏.

auto zoo = create_zoo();
Run Code Online (Sandbox Code Playgroud)

向量在堆栈上并自动清理,包含的对象不是.

返回各种子类型的对象.撤消值而不是指针是行不通的.

我在考虑使用

std::vector<std::unique_ptr<animal> > create_zoo();
Run Code Online (Sandbox Code Playgroud)

但是unique_ptr没有复制语义,我返回了vectorby值,理论上它创建了一个副本.

我可以放在vector堆上以避免这种情况

std::unique_ptr<std::vector<std::unique_ptr<animal> > > create_zoo();
Run Code Online (Sandbox Code Playgroud)

但这太荒谬了.

这也应该有效:

std::vector<std::shared_ptr<animal> > create_zoo();
Run Code Online (Sandbox Code Playgroud)

这可行,但它并没有真正转移所有权.调用者必须假设可能有其他指向对象的指针.

我愿意接受建议.不需要std::vector.我只是在寻找一种实现工厂的好方法,该工厂使用现代c ++返回多个对象的所有权.我现在正在避免提振.我正在尝试探索新的c ++ 11内容.

c++ pointers smart-pointers vector c++11

13
推荐指数
1
解决办法
1306
查看次数

DLL使用__stdcall没有名称装饰:为什么它甚至工作?

如果我声明一个这样的函数:

#ifdef TEST_EXPORTS
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif

TESTAPI int __stdcall myadd(int a, int b);
Run Code Online (Sandbox Code Playgroud)

DLL中的符号_myadd@8对我来说非常有意义(在这里阅读其他问题几个小时后,就是这样).

但是Windows库似乎做了不同的事情.它们也使用__stdcall(伪装成WINAPI),但DLL中的符号没有名称装饰.如果上面的方法在windows libs中,那么符号就是myadd.

我的猜测是他们使用def文件来对符号进行别名.但是当我链接到其中一个DLL时,为什么我的链接器知道这个?

windows头文件声明了这些函数WINAPI,所以如果我调用它们,链接器应该查找装饰名称,因为它是一个__stdcall函数.但不知何故,链接器知道删除名称装饰.

我试图通过编写一个小DLL并使用def文件删除名称修饰来复制它.正如预期的那样,我发现链接器错误,因为链接器仍然在寻找装饰名称.我在纯C中完成了这个,以确保c ++名称修改不会影响它.

编辑:澄清,MSVC 14.0/VS2015,32位

c dll winapi linker

11
推荐指数
1
解决办法
1359
查看次数

狮身人面像:让课程出现在TOC上

我开始使用ext.autodoc记录一些python类.我有几个带有内容的*.rst文件

========
mymodule
========

.. automodule:: mymodule
   .. autoclass:: myclassA
       :members:
   .. autoclass:: myclassB
       :members:
Run Code Online (Sandbox Code Playgroud)

加上一个index.rst:

.. toctree::
   :maxdepth: 2
   mymodule
Run Code Online (Sandbox Code Playgroud)

'mymodule'显示在目录中,但我也想看看TOC中的类:

  • MyModule的
    • myclassA
    • myclassB

我如何让sphinx为每个类创建一个类似的部分?或者有充分的理由不这样做吗?

谢谢

python-sphinx

10
推荐指数
1
解决办法
1752
查看次数

依赖项属性的XML文档

记录依赖属性的最佳方法是什么?

我应该在字段上放置xml文档:

/// <summary>Documentation goes here</summary>
public static readonly DependencyProperty NameProperty = 
        DependencyProperty.Register(...)
Run Code Online (Sandbox Code Playgroud)

或在酒店:

/// <summary>and/or here?</summary>
public string Name{ get{...} set{...} }
Run Code Online (Sandbox Code Playgroud)

还是我真的需要记录(和维护)两者?

sandcastle silverlight wpf dependency-properties xml-documentation

8
推荐指数
1
解决办法
1042
查看次数

文件存储的序列化

我编写了一个可以打开/编辑/保存文档的桌面应用程序.

这些文档由几个不同类型的对象描述,这些对象存储彼此的引用.当然,有一个Document类作为此数据结构的根.

问题是如何将此文档模型保存到文件中.

我需要的:

  • 支持递归结构.
  • 它必须能够打开文件,即使它们是从稍微不同的类生成的.我的用户不希望在每次发布后重新创建每个文档只是因为我在某处添加了一个字段.
  • 它必须处理编译时未知的类(用于插件支持).

到目前为止我累了:

  • XmlSerializer - >失败了第一个和最后一个标准.
  • BinarySerializer - >失败了第二个标准.

  • DataContractSerializer:与XmlSerializer类似,但支持循环(递归)引用.它的设计也考虑了(向前/向后)兼容性:数据合同版本控制.[编辑]

  • NetDataContractSerializer:虽然DataContractSerializer仍然需要提前知道所有类型(即它不能很好地继承),NetDataContractSerializer会在输出中存储类型信息.除此之外,两者似乎是等价的.[编辑]

  • protobuf-net:没有时间尝试它,但它似乎在功能上与DataContractSerializer类似,但使用二进制格式.[编辑]

处理未知类型[编辑]

当静态和动态类型不同时,似乎有两种关于该做什么的哲学(如果你有一个类型为object的字段,但是a,比方说,其中包含Person-object).基本上动态类型必须以某种方式存储在文件中.

  • 对不同的动态类型使用不同的XML标记.但是,由于要用于特定类的XML标记可能不等于类名,因此如果反序列化器事先知道所有可能的类型(以便他可以扫描它们的属性),则只能使用此路由.

  • 在序列化期间存储CLR类型(类名,程序集名称和版本).在反序列化期间使用此信息来实例化正确的类.在反序列化之前不得知道这些类型.

第二个更易于使用,但生成的文件将依赖于CLR(并且对代码修改不太敏感).这可能是为什么XmlSerializerDataContractSerializer选择第一种方式.NetDataContractSerializer不推荐,因为它使用第二个approch(BinarySerializer顺便说一下).

有任何想法吗?

.net c# serialization xml-serialization

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

`del x`在Python中是否有用?

del语句有许多实际用途来删除属性等(参见什么时候在python中有用?等等),但它也可以用来取消绑定局部变量:

 def test():
    x = ...
    del x
Run Code Online (Sandbox Code Playgroud)

这有什么实际用例吗?

想到垃圾收集,但x=None应该具有相同的效果.我也听说"导入后清理"是一个原因,但from ... import ...做得更好."更清洁的代码"也出现了,但我不知道如何del使代码更清晰(至少对于不需要重构的代码而言).

编辑:

这有点失控.我期待一个像这样的答案

"当然你需要del x!你做不到......不然,不管怎样,呃!"

我想现在可以说没有这样的答案.如果有用途,那么它们的编码风格相关并且"有争议".

我试图通过在问题中直接反击最常见的问题来避免"意见"的讨论,显然这不起作用......

我只是好奇为什么Python有这个功能,并认为可能有一些最好的实践让我学习.

既然其他人都有他们的意见,那么让我自己加一点:

我建议不要解除局部变量的绑定.经验不足的Python程序员(特别是那些具有C++背景的程序员)很可能会被解读del xdelete the object referenced by x.他们经常把它del x当作捷径x.__del__().许多人__del__经常使用它们.我多次看到这种误解.它最糟糕的是它最初适用于它们!使用简单的代码,对象只从该变量引用,CPython的行为就像他们认为的那样.因此,初学者会对他们的误解得到积极的强化,并开始越来越频繁地使用它,最终导致大量的错误代码和他们不理解的怪异行为.

python python-2.7

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

只写`glMapBuffer`,如果我不全部写呢?

假设我有一个包含一些数据的缓冲区对象。

我使用glMapBufferwithGL_WRITE_ONLY并每隔一个字节写入一次(想想交错的顶点属性)。

然后我glUnmapBuffer缓冲。

我没有写入的字节是保留的还是现在未定义的?

我想知道因为 的主要目的GL_WRITE_ONLY似乎是避免将缓冲区的先前内容从卡的内存传输到主内存。但是,驱动程序无法知道我实际写入了哪些字节以便仅部分更新缓冲区。

所以要么驱动程序首先将内容传输到主内存,GL_WRITE_ONLY在我能想到的几乎所有平台上都毫无意义。或者假设我写了完整的映射区域。然而,手册页中没有提到这种义务。

opengl

4
推荐指数
1
解决办法
388
查看次数

为什么std :: string构造函数重置GetLastError

我从C++代码调用Windows API,我有一个辅助方法来完成FormatMessage这些工作,并为错误处理抛出异常.功能的签名是

void throw_system_error(const std::string& msg_prefix, DWORD messageid)
Run Code Online (Sandbox Code Playgroud)

我注意到一些奇怪的事情.此代码无法正常运行:

handle = ...;
if (handle == NULL) {
    throw_system_error("something bad happened", GetLastError());
}
Run Code Online (Sandbox Code Playgroud)

传递给的错误代码 throw_system_error始终为零.

这在哪里工作得很好:

handle = ...;
if (handle == NULL) {
    DWORD error = GetLastError();
    throw_system_error("something bad happened", error);
}
Run Code Online (Sandbox Code Playgroud)

更多调查显示此版本存在同样的问题:

handle = ...;
if (handle == NULL) {
    std::string msg("something bad happened");
    DWORD error = GetLastError();
    throw_system_error(msg, error);
}
Run Code Online (Sandbox Code Playgroud)

它寻找所有的世界,好像构造函数std::string正在重置错误代码.

我的猜测std::string是内部分配内存导致一些系统调用,然后将最后一个错误设置回零.

谁知道这里到底发生了什么?

Visual C++ 2015,64位.

c++ error-handling winapi

4
推荐指数
1
解决办法
377
查看次数

ast.BoolOp什么时候有两个以上的值?

Python的AST使用以下命令定义布尔表达式

BoolOp(boolop op, expr* values)
Run Code Online (Sandbox Code Playgroud)

我希望它与相似BinOp,带有leftright值。

有人可以给我一个示例代码,其中AST具有多个不同于两个的值吗?

编辑:

显然会x and y and z产生三个值。所以让我改一下:

为什么不将其建模为两个嵌套BoolOp表达式?

python python-2.7

3
推荐指数
1
解决办法
385
查看次数

在哪里放置maven构建库的演示/示例代码?

我使用maven开发了一个小的java实用程序库.现在我想添加一些演示/示例代码来展示如何使用该库.

放在哪里最好的地方?

  • 在包含其他代码的子包中.我不喜欢这个,因为它意味着演示将包含在库jar文件中.

  • 在一个新的maven神器.这是有效的,但我希望让演示更紧密地连接到库源.

  • 作为子工件.还没试过这个.似乎使一切都变得复杂,应该是简单的事情.

这有什么共同的模式吗?

java maven

2
推荐指数
1
解决办法
341
查看次数