我想创建一个包含嵌入信息的字符串.实现我想要的一种方式(不是唯一的方法)称为字符串插值或变量替换,其中字符串中的占位符用实际值替换.
在C中,我会做这样的事情:
printf("error! value was %d but I expected %d",actualValue,expectedValue)
Run Code Online (Sandbox Code Playgroud)
而如果我在python中编程,我会做这样的事情:
"error! value was {0} but I expected {1}".format(actualValue,expectedValue)
Run Code Online (Sandbox Code Playgroud)
这两个都是字符串插值的例子.
我怎么能用C++做到这一点?
重要提示:
std::cout如果我想将这样的消息打印到标准输出(不是字符串插值,但打印出我想要的字符串类型):cout << "error! value was " << actualValue << " but I expected "
<< expectedValue;
Run Code Online (Sandbox Code Playgroud)
我不想将字符串打印到stdout.我想将std::string一个参数作为参数传递给一个函数(例如异常对象的构造函数).
编辑
对于我的直接使用,我并不关心性能(我正在大声提出异常!). 但是,了解各种方法的相对性能通常非常有用.
为什么不直接使用printf(毕竟C++是C的超集......)? 这个答案讨论了一些原因.根据我的理解,类型安全是一个重要原因:如果你把%d放在那里,你放在那里的变量最好真的可以转换为整数,因为这就是函数如何计算它是什么类型.使用一种方法可以更加安全,该方法使用要插入的变量的实际类型的编译时知识.
在python 2.7.6中,假设我有一个定义__eq__的类及其子类:
>>> class A(object):
... def __eq__(self,other):
... print self.__class__,other.__class__
... return True
...
>>> class B(A):
... pass
...
Run Code Online (Sandbox Code Playgroud)
现在我创建每个类的对象,并想要比较它们:
>>> a = A()
>>> b = B()
>>> a==b
Run Code Online (Sandbox Code Playgroud)
结果我得到:
<class '__main__.B'> <class '__main__.A'>
Run Code Online (Sandbox Code Playgroud)
这表明解释器正在调用b.__eq__(a),而不是a.__eq__(b)预期的.
该文档的状态(强调):
对于对象
x和y,首先x.__op__(y)是尝试.如果没有实现或返回NotImplemented,y.__rop__(x)则尝试.如果这也没有实现或返回NotImplemented,TypeError则引发异常.但请参阅以下异常:前一项的异常:如果左操作数是内置类型或新样式类的实例,并且右操作数是该类型或类的正确子类的实例并覆盖基
__rop__()类的方法,则右操作数的__rop__()方法在左操作数的__op__()方法之前尝试.这样做是为了使子类可以完全覆盖二元运算符.否则,左操作数的
__op__()方法将始终接受右操作数:当期望给定类的实例时,该类的子类的实例始终是可接受的.
由于子类B不会覆盖__eq__ …
我有一个Git仓库已经远程设置("混帐取"的作品),但它不具有任何远程分支:"git的/参/遥控器"文件夹不存在,
git branch -r
Run Code Online (Sandbox Code Playgroud)
什么都不返回(空列表,没有分支).然而,实际的远程存储库确实有一个分支.如果我再克隆远程回购,我得到另一个地方的回购协议是不具备远程分支机构.
我不认为这种状态是可能的.我的问题:
附加信息
"git config --get remote.origin.fetch"为空(即命令不产生输出)
"git remote show origin"节目
$ git remote show origin
* remote origin
Fetch URL: <correct remote url here>
Push URL: <correct remote url here>
HEAD branch: master
Local ref configured for 'git push':
master pushes to master (up to date)
Run Code Online (Sandbox Code Playgroud) 这是场景:
git add和所有事情).git rebase --continue继续运行rebase我通常不会这样做,但这种特殊的冲突需要一些严重的重新编码,我觉得需要记录.
我该怎么做呢?我希望有某种git rebase --continue --let-me-edit-the-message-first命令,但我无法在文档中找到它
我知道:
git rebase必须将提交消息存储在某处,因为当它提交时它会将原始消息放入其中.我只想在两者之间插入我的编辑.rebase --continue,然后使用git rebase -i返回并稍后编辑有问题的提交消息.这要求我记住我在整个(可能很长)的rebase过程中提交的内容.呸.我有点惊讶,我已经找不到答案了......我希望有办法做到这一点.如果有答案,我很难找到它.我发现混淆git add等等git rm于解决变化的需要或之后(像这样),一般git rebase智慧(比如这个和这个),以及许多看似非常特定于特定情况的问题(像这样).
由于我很惊讶我找不到这个答案,所以我有一个第二个问题:是否有更好的方法来记录在rebase期间所做的更改?
我正在尝试编写一些cython代码来进行numpy数组的计算.Cython似乎不喜欢我见过的所有示例中使用的[]来定义数据类型和维数.
例如,我有一个文件test.pyx:
cimport numpy as np
import numpy as np
ctypedef np.ndarray[np.float64_t, ndim=2] mymatrix
cpdef mymatrix hat (mymatrix x):
a = np.zeros((3,3));
a[0,1] = x[2,0];
a[0,2] = -x[1,0];
a[1,2] = x[0,0];
a[1,0] = -x[2,0];
a[2,0] = x[1,0];
a[2,1] = -x[0,0];
return a;
Run Code Online (Sandbox Code Playgroud)
我使用setup.py编译它(参见结尾),我使用"python setup.py build_ext --inplace"运行
我得到以下输出:
running build_ext
cythoning test.pyx to test.c
Error converting Pyrex file to C:
------------------------------------------------------------
...
cimport numpy as np
import numpy as np
ctypedef np.ndarray[np.float64_t, ndim=2] mymatrix
^
------------------------------------------------------------
test.pyx:4:42: Syntax error in ctypedef …Run Code Online (Sandbox Code Playgroud) 我正在编写一个脚本,它使用日志记录模块来处理脚本的详细程度.我正在使用Eclipse的PyDev插件并运行Python 3.2.如果我"运行"脚本一切正常,但如果我"调试"脚本,我会收到以下错误:
Traceback (most recent call last):
File "C:\Program Files (x86)\Eclipse\eclipse\plugins\org.python.pydev_3.2.0.201312292215\pysrc\pydevd.py", line 1146, in trace_dispatch
filename, base = GetFilenameAndBase(frame)
File "C:\Program Files (x86)\Eclipse\eclipse\plugins\org.python.pydev_3.2.0.201312292215\pysrc\pydevd_file_utils.py", line 224, in GetFilenameAndBase
return NORM_FILENAME_AND_BASE_CONTAINER[f]
TypeError: 'NoneType' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚错误来自哪里,所以我开始评论所有内容并找出"导入日志记录"语句导致错误.这是我正在运行的代码:
import logging
def main():
print("Logging import test")
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
我已经检查过以确保日志记录模块与我的Python32安装位置中的所有其他标准模块一起使用.有任何想法吗?同样,这只是在我以调试模式运行PyDev时; 运行完成,没有错误.谢谢!
我开始乱搞git filter-branch.--all选项重写所有分支和标记.凉. git filter-branch创建它覆盖refs/original的所有引用的备份.很酷.现在我想把我所有的实验都filter-branch吹走.
有没有一种简单的方法来完全撤消效果git filter-branch <whatever filter> -- --all?即将所有重写的分支一次性恢复到原始状态?
如果没有预先存在的方式,应该有.如果没有预先存在的方式,是否有人会有一个简短的脚本来执行此操作?
显然有一些解决方法.我可以手动恢复它,一次一个分支,就像在这个问题中一样.或者我可以直接核对并重新克隆.要么在一个包含许多分支/标签的回购中快速繁琐,要么(比如说)被分成更小的回购.
问题:给出一个sympy表达式,是否有一种简单的方法来生成python代码(最后我想要一个.py或者.pyc文件)?我想这个代码将包含一个给出任何必要输入的函数,并返回表达式的值.
为什么
我发现自己经常需要生成python代码来计算一些令人讨厌的东西,例如讨厌的非线性函数的雅可比矩阵.
我可以用sympy来得出我想要的非线性事物的表达式:非常好.我当时想要的是从生成的sympy表达式生成python代码,并将该python代码保存到它自己的模块中.我以前做过这个,但我必须:
我注意到sympy具有其他几种语言的代码生成功能,但不支持python.有没有一种简单的方法可以让python代码脱离同情?
我知道围绕这个问题的几种可能但有问题的方法:
我知道我可以在sympy表达式上调用evalf并插入我想要的数字.这有几个不幸的副作用:
evalf每次.我也知道我可以生成C代码,然后使用大量工具(python/C api,cython,weave,swig等等)包装该代码.但是,这意味着我的代码现在依赖于有适当的C编译器.
编辑:摘要 似乎sympy.python,或者可能只是str(表达式)是有的(参见smichr的回答和Oliver W.的评论),它们适用于简单的标量表达式.
这对像Jacobians这样的事情没有多大帮助,但似乎sympy.printing.print_ccode也在矩阵上窒息.我认为可以处理将矩阵打印到另一种语言的代码必须假定目标语言中的矩阵支持,对于python而言可能意味着依赖于像numpy这样的东西.如果存在生成numpy代码的这种方式会很好,但它似乎没有.
如果我运行一个简单的ansible剧本,那么经常会从失败的任务中获得难以阅读的输出,如下所示。大问题:
标准输出中的换行符打印为\ n,而不是实际的换行符。这使得诸如python追溯之类的东西非常令人讨厌。
stdout,stderr,cmd ...输出的json blob包含很多有用的东西,但是由于它们都在同一行上一起运行,因此人类很难解析。
我怎样才能以一种易于阅读的格式打印其输出,以便进行调试?
这是令人讨厌的输出:
$ ansible-playbook playbooks/backUpWebsite.yml
PLAY [localhost]
***************************************************************
TASK [command]
*****************************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "python -c 'ksjfasdlkjf'", "delta": "0:00:00.037459", "end": "2017-10-03 19:58:50.525257", "failed": true, "rc": 1, "start": "2017-10-03 19:58:50.487798", "stderr": "Traceback (most recent call last):\n File \"<string>\", line 1, in <module>\nNameError: name 'ksjfasdlkjf' is not defined", "stdout": "", "stdout_lines": [], "warnings": []}
to retry, use: --limit @<snip>playbooks/backUpWebsite.retry
PLAY RECAP
*********************************************************************
localhost : ok=0 changed=0 unreachable=0 failed=1
Run Code Online (Sandbox Code Playgroud)
这是生成它的脚本:
---
- hosts: …Run Code Online (Sandbox Code Playgroud) 我从 git 中删除了一些文件,现在想要它们回来。我正在尝试使用git checkout来恢复文件。
我回顾了我的历史,并确定了文件被删除的提交。当我跑步时git checkout <sha of deleting commit> path/to/my/file,我得到
error: pathspec 'path/to/my/file' did not match any file(s) known to git.
我究竟做错了什么?
我想知道 git 合并冲突解决期间“共同祖先”提交的身份。
换句话说:我想知道当我在git merge.
希望有一个命令可以告诉我这些信息吗?
为什么我想知道
BASE -> LOCAL和BASE -> REMOTE),以便为我提供更多有关这两组更改如何发生、谁进行、何时、在哪些分支上进行等的背景信息。有用的(?)相关信息
回想一下,对于任何特定的冲突文件,都有
git show :1:<path>),来自共同祖先提交(其身份是我问题的答案)git show :2:<path>版本和git show :3:<path>版本我知道我可以通过使用获取 BASE 文件本身的 SHA 哈希值,git ls-files -u它给出的输出如下
$ git ls-files -u | grep "<path>"
100644 <SHA of BASE file> 1 <path>
100644 <SHA of LOCAL file> 2 <path>
100644 <SHA of REMOTE file> 3 <path>
Run Code Online (Sandbox Code Playgroud)
我正在使用 …
我想创建一个"Tag"类,可以将其名称指定为点分隔名称,"this.is.my.name"或者作为字符串向量,如{"this","is","my","name"}.
当我尝试这样做时,编译器有时会告诉我我的调用是不明确的.我想知道(1)为什么这个含糊不清,以及(2)为什么它有时只是含糊不清.
这是我的示例代码,您也可以在Coliru上查看和编译
#include <string>
#include <vector>
#include <iostream>
class Tag
{
public:
explicit Tag(std::string name);
explicit Tag(std::vector<std::string> name);
};
Tag::Tag(std::string name)
{
//here 'name' will be a dotted collection of strings, like "a.b.c"
}
Tag::Tag(std::vector<std::string> name)
{
//here 'name' will be a vector of strings, like {"a","b","c"}
}
int main(int argc, char**argv)
{
Tag imaTag{{"dotted","string","again"}};
Tag imaTagToo{"dotted.string"};
//everything is fine without this line:
Tag imaTagAlso{{"dotted","string"}};
std::cout << "I made two tags" …Run Code Online (Sandbox Code Playgroud) git ×5
python ×4
c++ ×2
ansible ×1
c++11 ×1
cython ×1
eclipse ×1
git-rebase ×1
logging ×1
nonetype ×1
overloading ×1
pydev ×1
python-2.7 ×1
rebase ×1
sympy ×1