小编sto*_*tic的帖子

C++中的"字符串插值":构造一个带有嵌入值的std :: string(例如,用于错误消息)?

我想创建一个包含嵌入信息的字符串.实现我想要的一种方式(不是唯一的方法)称为字符串插值或变量替换,其中字符串中的占位符用实际值替换.

在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++做到这一点?

重要提示:

  1. 我知道我可以使用,std::cout如果我想将这样的消息打印到标准输出(不是字符串插值,但打印出我想要的字符串类型):
cout << "error! value was " << actualValue << " but I expected "
<< expectedValue;
Run Code Online (Sandbox Code Playgroud)

我不想将字符串打印到stdout.我想将std::string一个参数作为参数传递给一个函数(例如异常对象的构造函数).

  1. 我正在使用C++ 11,但可移植性可能是一个问题,所以知道哪些方法有效,哪些方法不适用于哪个版本的C++.

编辑

  1. 对于我的直接使用,我并不关心性能(我正在大声提出异常!). 但是,了解各种方法的相对性能通常非常有用.

  2. 为什么不直接使用printf(毕竟C++是C的超集......)? 这个答案讨论了一些原因.根据我的理解,类型安全是一个重要原因:如果你把%d放在那里,你放在那里的变量最好真的可以转换为整数,因为这就是函数如何计算它是什么类型.使用一种方法可以更加安全,该方法使用要插入的变量的实际类型的编译时知识.

c++ c++11

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

对于没有覆盖的子类,python的a == b调用b .__ eq __(a)

在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)预期的.

文档的状态(强调):

  • 对于对象xy,首先x.__op__(y)是尝试.如果没有实现或返回NotImplemented,y.__rop__(x)则尝试.如果这也没有实现或返回NotImplemented,TypeError则引发异常.但请参阅以下异常:

  • 前一项的异常:如果左操作数是内置类型或新样式类的实例,并且右操作数是该类型或类的正确子类的实例并覆盖基__rop__()方法,则右操作数的__rop__()方法在左操作数的__op__()方法之前尝试.

    这样做是为了使子类可以完全覆盖二元运算符.否则,左操作数的__op__()方法将始终接受右操作数:当期望给定类的实例时,该类的子类的实例始终是可接受的.

由于子类B不会覆盖__eq__ …

python python-2.7

19
推荐指数
2
解决办法
1535
查看次数

Git存储库丢失了它的远程分支?

我有一个Git仓库已经远程设置("混帐取"的作品),但它具有任何远程分支:"git的/参/遥控器"文件夹不存在,

git branch -r 
Run Code Online (Sandbox Code Playgroud)

什么都不返回(空列表,没有分支).然而,实际的远程存储库确实有一个分支.如果我再克隆远程回购,我得到另一个地方的回购协议是具备远程分支机构.

我不认为这种状态是可能的.我的问题:

  1. 我到底是怎么进入这种状态的?
  2. 是否有一个命令可以运行以放回".git/refs/remotes"?(没有一个新鲜的克隆,我已经完成了).

附加信息

"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 version-control

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

git rebase - 继续,但修改提交消息以在冲突解决期间记录更改?

这是场景:

  • 我在git中重新定义了一个分支,我遇到了冲突并且解决了它们(确实git add和所有事情).
  • 通常情况下,我会git rebase --continue继续运行rebase
  • 我想编辑此提交的提交消息,以解释我在解决冲突时所做的更改

我通常不会这样做,但这种特殊的冲突需要一些严重的重新编码,我觉得需要记录.

我该怎么做呢?我希望有某种git rebase --continue --let-me-edit-the-message-first命令,但我无法在文档中找到它

我知道:

  • 我可以运行git commit,手动复制现有的提交消息然后修改它.我不想这样做. git rebase必须将提交消息存储在某处,因为当它提交时它会将原始消息放入其中.我只想在两者之间插入我的编辑.
  • 我可以运行git rebase --continue,然后使用git rebase -i返回并稍后编辑有问题的提交消息.这要求我记住我在整个(可能很长)的rebase过程中提交的内容.呸.

我有点惊讶,我已经找不到答案了......我希望有办法做到这一点.如果有答案,我很难找到它.我发现混淆git add等等git rm于解决变化的需要或之后(像这样),一般git rebase智慧(比如这个这个),以及许多看似非常特定于特定情况的问题(像这样).

由于我很惊讶我找不到这个答案,所以我有一个第二个问题:是否有更好的方法来记录在rebase期间所做的更改?

git rebase git-rebase

11
推荐指数
2
解决办法
2193
查看次数

在cython中使用numpy:定义ndarray数据类型/ ndims

我正在尝试编写一些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)

python cython

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

PyDev调试模式TypeError:'NoneType'对象不可订阅'

我正在编写一个脚本,它使用日志记录模块来处理脚本的详细程度.我正在使用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时; 运行完成,没有错误.谢谢!

python eclipse logging pydev nonetype

8
推荐指数
0
解决办法
1079
查看次数

撤消"git filter-branch ... - --all"?在一个命令?

我开始乱搞git filter-branch.--all选项重写所有分支和标记.凉. git filter-branch创建它覆盖refs/original的所有引用的备份.很酷.现在我想把我所有的实验都filter-branch吹走.

有没有一种简单的方法来完全撤消效果git filter-branch <whatever filter> -- --all?即将所有重写的分支一次性恢复到原始状态?

如果没有预先存在的方式,应该有.如果没有预先存在的方式,是否有人会有一个简短的脚本来执行此操作?

显然有一些解决方法.我可以手动恢复它,一次一个分支,就像在这个问题中一样.或者我可以直接核对并重新克隆.要么在一个包含许多分支/标签的回购中快速繁琐,要么(比如说)被分成更小的回购.

git git-filter-branch

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

从sympy表达式生成python代码?

问题:给出一个sympy表达式,是否有一种简单的方法来生成python代码(最后我想要一个.py或者.pyc文件)?我想这个代码将包含一个给出任何必要输入的函数,并返回表达式的值.

为什么

我发现自己经常需要生成python代码来计算一些令人讨厌的东西,例如讨厌的非线性函数的雅可比矩阵.

我可以用sympy来得出我想要的非线性事物的表达式:非常好.我当时想要的是从生成的sympy表达式生成python代码,并将该python代码保存到它自己的模块中.我以前做过这个,但我必须:

  1. 呼叫str(sympyResult)
  2. 使用正则表达式进行自定义操作以使此字符串看起来像有效的python代码
  3. 将此python代码写入文件

我注意到sympy具有其他几种语言的代码生成功能,但不支持python.有没有一种简单的方法可以让python代码脱离同情?

我知道围绕这个问题的几种可能但有问题的方法:

  1. 我知道我可以在sympy表达式上调用evalf并插入我想要的数字.这有几个不幸的副作用:

    • 依赖:我的代码现在依赖于sympy来运行.这是不好的.
    • 效率:每次我在数字上评估时,现在必须运行同情:即使我挑剔表达,我仍然需要evalf每次.
  2. 我也知道我可以生成C代码,然后使用大量工具(python/C api,cython,weave,swig等等)包装该代码.但是,这意味着我的代码现在依赖于有适当的C编译器.

编辑:摘要 似乎sympy.python,或者可能只是str(表达式)是有的(参见smichr的回答和Oliver W.的评论),它们适用于简单的标量表达式.

这对像Jacobians这样的事情没有多大帮助,但似乎sympy.printing.print_ccode也在矩阵上窒息.我认为可以处理将矩阵打印到另一种语言的代码必须假定目标语言中的矩阵支持,对于python而言可能意味着依赖于像numpy这样的东西.如果存在生成numpy代码的这种方式会很好,但它似乎没有.

python sympy

7
推荐指数
2
解决办法
2719
查看次数

使用ansible进行调试:如何从失败的命令中获取stderr和stdout,以尊重换行符的方式打印出来,从而使其易于阅读?

如果我运行一个简单的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)

ansible

6
推荐指数
1
解决办法
4968
查看次数

git checkout 从先前的分支恢复文件:pathspec 与 git 已知的任何文件都不匹配

我从 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

5
推荐指数
1
解决办法
1584
查看次数

git 合并冲突:哪个提交是共同祖先?

我想知道 git 合并冲突解决期间“共同祖先”提交的身份。

换句话说:我想知道我在git merge.

希望有一个命令可以告诉我这些信息吗?

为什么我想知道

  • 我(不幸的是)正在做一个非常复杂的合并,有很多冲突。
  • 我希望能够可视化这两个更改路径 (BASE -> LOCALBASE -> REMOTE),以便为我提供更多有关这两组更改如何发生、谁进行、何时、在哪些分支上进行等的背景信息。

有用的(?)相关信息

  • 回想一下,对于任何特定的冲突文件,都有

    • 一个 BASE 版本 ( git show :1:<path>),来自共同祖先提交(其身份是我问题的答案)
    • LOCAL(我所在的分支:)git show :2:<path>版本和
    • REMOTE(我正在合并的分支:)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)
  • 我正在使用 …

git git-merge-conflict

5
推荐指数
1
解决办法
750
查看次数

如何解决构造函数采用std :: string和std :: vector之间的歧义

我想创建一个"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)

c++ overloading ambiguous-call

0
推荐指数
1
解决办法
175
查看次数