我们都知道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吗?
有时我会看到术语"自由线程"来描述一个类或一个方法.它似乎与"线程安全"具有相似或相同的含义.
这两个术语有区别吗?
我有一个工厂方法,它创建一堆对象并返回指向它们的指针.对象的所有权转移给调用者:
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内容.
如果我声明一个这样的函数:
#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位
我开始使用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中的类:
我如何让sphinx为每个类创建一个类似的部分?或者有充分的理由不这样做吗?
谢谢
记录依赖属性的最佳方法是什么?
我应该在字段上放置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
我编写了一个可以打开/编辑/保存文档的桌面应用程序.
这些文档由几个不同类型的对象描述,这些对象存储彼此的引用.当然,有一个Document类作为此数据结构的根.
问题是如何将此文档模型保存到文件中.
XmlSerializer - >失败了第一个和最后一个标准.BinarySerializer - >失败了第二个标准.
DataContractSerializer:与XmlSerializer类似,但支持循环(递归)引用.它的设计也考虑了(向前/向后)兼容性:数据合同版本控制.[编辑]
NetDataContractSerializer:虽然DataContractSerializer仍然需要提前知道所有类型(即它不能很好地继承),NetDataContractSerializer会在输出中存储类型信息.除此之外,两者似乎是等价的.[编辑]
protobuf-net:没有时间尝试它,但它似乎在功能上与DataContractSerializer类似,但使用二进制格式.[编辑]
当静态和动态类型不同时,似乎有两种关于该做什么的哲学(如果你有一个类型为object的字段,但是a,比方说,其中包含Person-object).基本上动态类型必须以某种方式存储在文件中.
对不同的动态类型使用不同的XML标记.但是,由于要用于特定类的XML标记可能不等于类名,因此如果反序列化器事先知道所有可能的类型(以便他可以扫描它们的属性),则只能使用此路由.
在序列化期间存储CLR类型(类名,程序集名称和版本).在反序列化期间使用此信息来实例化正确的类.在反序列化之前不得知道这些类型.
第二个更易于使用,但生成的文件将依赖于CLR(并且对代码修改不太敏感).这可能是为什么XmlSerializer并DataContractSerializer选择第一种方式.NetDataContractSerializer不推荐,因为它使用第二个approch(BinarySerializer顺便说一下).
有任何想法吗?
该del语句有许多实际用途来删除属性等(参见什么时候在python中有用?等等),但它也可以用来取消绑定局部变量:
def test():
x = ...
del x
Run Code Online (Sandbox Code Playgroud)
这有什么实际用例吗?
想到垃圾收集,但x=None应该具有相同的效果.我也听说"导入后清理"是一个原因,但from ... import ...做得更好."更清洁的代码"也出现了,但我不知道如何del使代码更清晰(至少对于不需要重构的代码而言).
编辑:
这有点失控.我期待一个像这样的答案
"当然你需要del x!你做不到......不然,不管怎样,呃!"
我想现在可以说没有这样的答案.如果有用途,那么它们的编码风格相关并且"有争议".
我试图通过在问题中直接反击最常见的问题来避免"意见"的讨论,显然这不起作用......
我只是好奇为什么Python有这个功能,并认为可能有一些最好的实践让我学习.
既然其他人都有他们的意见,那么让我自己加一点:
我建议不要解除局部变量的绑定.经验不足的Python程序员(特别是那些具有C++背景的程序员)很可能会被解读del x为delete the object referenced by x.他们经常把它del x当作捷径x.__del__().许多人__del__经常使用它们.我多次看到这种误解.它最糟糕的是它最初适用于它们!使用简单的代码,对象只从该变量引用,CPython的行为就像他们认为的那样.因此,初学者会对他们的误解得到积极的强化,并开始越来越频繁地使用它,最终导致大量的错误代码和他们不理解的怪异行为.
假设我有一个包含一些数据的缓冲区对象。
我使用glMapBufferwithGL_WRITE_ONLY并每隔一个字节写入一次(想想交错的顶点属性)。
然后我glUnmapBuffer缓冲。
我没有写入的字节是保留的还是现在未定义的?
我想知道因为 的主要目的GL_WRITE_ONLY似乎是避免将缓冲区的先前内容从卡的内存传输到主内存。但是,驱动程序无法知道我实际写入了哪些字节以便仅部分更新缓冲区。
所以要么驱动程序首先将内容传输到主内存,GL_WRITE_ONLY在我能想到的几乎所有平台上都毫无意义。或者假设我写了完整的映射区域。然而,手册页中没有提到这种义务。
我从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位.
Python的AST使用以下命令定义布尔表达式
BoolOp(boolop op, expr* values)
Run Code Online (Sandbox Code Playgroud)
我希望它与相似BinOp,带有left和right值。
有人可以给我一个示例代码,其中AST具有多个不同于两个的值吗?
编辑:
显然会x and y and z产生三个值。所以让我改一下:
为什么不将其建模为两个嵌套BoolOp表达式?
我使用maven开发了一个小的java实用程序库.现在我想添加一些演示/示例代码来展示如何使用该库.
放在哪里最好的地方?
在包含其他代码的子包中.我不喜欢这个,因为它意味着演示将包含在库jar文件中.
在一个新的maven神器.这是有效的,但我希望让演示更紧密地连接到库源.
作为子工件.还没试过这个.似乎使一切都变得复杂,应该是简单的事情.
这有什么共同的模式吗?
python ×3
c++ ×2
python-2.7 ×2
winapi ×2
.net ×1
c ×1
c# ×1
c++11 ×1
dll ×1
if-statement ×1
java ×1
linker ×1
maven ×1
opengl ×1
pointers ×1
sandcastle ×1
silverlight ×1
vector ×1
wpf ×1