有没有人知道是否有任何内置的python方法将检查某些东西是否是一个有效的python变量名称,包括对保留关键字的检查?(所以,就像'in'或'for'之类的东西会失败......)
如果不这样做,是否有人知道我在哪里可以获得保留关键字的列表(即,从python中的动态,而不是从在线文档中复制和粘贴某些内容)?或者,有另一种写自己支票的好方法吗?
令人惊讶的是,通过在try/except中包装setattr进行测试不起作用,如下所示:
setattr(myObj, 'My Sweet Name!', 23)
Run Code Online (Sandbox Code Playgroud)
......实际上有效!(...甚至可以用getattr检索!)
我想做的是这样的事情:
template <class DataType>
DataType myFunc(DataType in)
{
...
}
typedef myFunc<int> myFunc_i;
myFunc_i(37);
Run Code Online (Sandbox Code Playgroud)
...但是,在C++中,typedef不能用于这样的函数.我想知道的是......在这种情况下,人们首选的选择是什么?我唯一能想到的是:
1)只需处理它,并始终使用myFunc语法2)手动创建包装函数,即
inline int myFunc_i(int in)
{
return myFunc<int>(in);
}
Run Code Online (Sandbox Code Playgroud)
这可行,但是需要额外维护的缺点,以及它可能会失去同步(即,如果你更改myFunc的函数签名).
思考?
当只有一个否定提交时,git 的或--ancestry-path选项的行为相对简单 - 也就是说,如果您有:git loggit rev-list
git rev-list ^A B
# or it's shorthand form:
git rev-list A..B
Run Code Online (Sandbox Code Playgroud)
...那么结果是 A 的后代和 B 的祖先的所有提交(有关更完整的解释,请参见此处)。
但是,我想知道--ancestry-path如果您有两个(或更多)否定修订的行为 - 即:
git rev-list ^C ^A B
Run Code Online (Sandbox Code Playgroud)
(注意 - 我将非否定的修订,例如B上述,称为“积极”提交,而所有否定的修订称为“消极”提交。)
在一些简单的测试用例中检查结果后--ancestry-path,负面提交所施加的“后代”限制似乎是 OR'd / union'ed - 也就是说,git 似乎正在做:
或者,在更像集合的符号中:
IntersectionOf(
Union(ancestors(positive1), ...ancestors(positiveN))
AND
Union(descendents(negative1), ...descendents(negativeN))
)
- Union(ancestors(negative1), ...ancestors(negativeN))
Run Code Online (Sandbox Code Playgroud)
然而,在一些更复杂的场景中,这被证明是不正确的 - 最终结果中排除的提交比上述逻辑所暗示的要多。
例如,假设您有这个完整的图表:
ancestors(MA3)
-----MA3
/ |
/ MB3
A3 /|
/| …Run Code Online (Sandbox Code Playgroud) 出于某种原因,当我在我的程序中将变量定义为"uint"而不是"unsigned int"时,它会出错.这看起来很奇怪,因为uint的typedef为:
typedef unsigned int uint;
Run Code Online (Sandbox Code Playgroud)
......所以我认为我可以互换地使用这两个.更确切地说,我正在分配一个函数的结果,该函数将"unsigned int"返回到uint变量中,然后在向量调整大小调用中使用该uint ...此时它出错.即,我的代码看起来像这样:
unsigned int getUInt()
{
return 3;
}
int main(void) {
vector<vector<float> > vectVect(100000);
for(uint i = 0; i < vectVect.size(); ++i)
{
vector<float>& myVect = vectVect[i];
uint myUnsignedInt = getUInt();
myVect.resize(myUnsignedInt);
}
cout << "finished" << endl;
}
Run Code Online (Sandbox Code Playgroud)
...它出错的行是myVect.resize行.
显然,我已经有了一个解决方案,但我想了解为什么会发生这种情况,因为我非常困惑.有人有主意吗?
PS - 如果有人认为它可能很重要,我在fedora 15上使用gcc v4.1.2 ...而定义uint的include文件是/usr/include/sys/types.h.
...当我尝试执行如下所示的查询时:
Session().query(MyMappedClass).update({MyMappedClass.time:func.now()})
Run Code Online (Sandbox Code Playgroud)
我明白了:
InvalidRequestError: Could not evaluate current criteria in Python. Specify 'fetch' or False for the synchronize_session parameter.
Run Code Online (Sandbox Code Playgroud)
但如果我这样做:
Session().query(MyMappedClass).update({MyMappedClass.time:'now()'})
Run Code Online (Sandbox Code Playgroud)
...有用.谁知道为什么?
我正在寻找一种方法来确保当我完成它时,在堆上执行的对象总是被释放.
我知道如果它被分配在堆栈上,我可以使用RAII来确保它将被处理 - 不幸的是,这对我(至少直接)不起作用,因为有问题的对象实际上是通过调用api函数创建的然后返回指向它在堆上创建的对象的指针.
所以,从概念上讲,我想做的是:
TheApi::ApiObject* p_myObj = TheApi::createAnApiObj();
try
{
doStuffWithMyObjThatMayError(p_myObj);
}
finally
{
delete p_myObj;
}
Run Code Online (Sandbox Code Playgroud)
我唯一能想到的就是创建一些虚拟清理类,并在堆栈上创建一个实例:
class MegaMaid
{
private:
TheApi::ApiObject* toFree;
public:
MegaMaid(TheApi::ApiObject* toFree)
{
this->toFree = toFree;
}
~MegaMaid()
{
delete toFree;
}
};
void doStuff()
{
TheApi::ApiObject* p_myObj = TheApi::createAnApiObj();
TheApi::ApiObject* p_myObj;
MegaMaid cleaner(p_myObj);
doStuffWithMyObjThatMayError(p_myObj);
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现这一目标?或者这是公认的解决方案吗?
我经常在具有不同操作系统的台式机和笔记本电脑之间切换。为了协调,我想将我的开发/项目目录存储在Dropbox中。
Cargo将尝试target/debug从两个操作系统构建到同一目录(即)。理想情况下,我想要一种允许我在每个平台上自动构建到特定于平台的构建目录的方法:
target/x86_64-apple-darwintarget/x86_64-pc-windows-msvctarget/x86_64-unknown-linux-gnu...或类似的东西。