我有带有对象属性的Python类,它们只被声明为运行构造函数的一部分,如下所示:
class Foo(object):
def __init__(self, base):
self.basepath = base
temp = []
for run in os.listdir(self.basepath):
if self.foo(run):
temp.append(run)
self.availableruns = tuple(sorted(temp))
Run Code Online (Sandbox Code Playgroud)
如果我现在使用help(Foo)或尝试Foo在Sphinx中记录,则不显示self.basepath和self.availableruns属性.这对我们API的用户来说是一个问题.
我已经尝试寻找一种标准方法来确保解析器可以找到这些"动态声明"的属性(最好是docstring'd),但到目前为止还没有运气.有什么建议?谢谢.
我继承了一些可怕的遗留代码,其中包含大约1000行实用程序类定义,需要出现在源文件中的"真实"代码之前.为了避免与可能还有相关遗留类的其他模块发生冲突,我将实用程序类放入了一个未命名的命名空间:
namespace {
class OldUtils {
OldUtils();
int foo();
double bar();
};
OldUtils::OldUtils() {
// hundreds of lines
}
int OldUtils::foo() {
// hundreds more lines
}
...
}
class ActuallyInteresting {
// uses OldUtils
};
Run Code Online (Sandbox Code Playgroud)
但是我希望ActuallyInteresting人们将(实际上)感兴趣的代码靠近文件的顶部,例如从第50行开始,而不是在底部,例如从第1000行开始.将可怕的实用程序类拆分为单独的编译单位不是一个选项,出于更高层次的原因我不会进入!
所以我想知道是否有可能将短类声明 - 没有方法定义 - 放在文件顶部的未命名命名空间中,并在底部的另一个未命名的命名空间中放置更长的方法定义:
namespace {
class OldUtils {
OldUtils();
int foo();
double bar();
};
}
class ActuallyInteresting {
// uses OldUtils
};
namespace {
OldUtils::OldUtils() {
// hundreds of lines
}
int OldUtils::foo() {
// hundreds more lines
} …Run Code Online (Sandbox Code Playgroud) 我有几个C++/Python的代码项目,其中使用LaTeX格式的描述和标签来生成使用LaTeX + pstricks制作的PDF文档或图形.但是,我们还有一些纯文本输出,例如文档的HTML版本(我已经有代码为其编写最小标记)和非TeX启用的绘图渲染器.
对于这些,我想消除例如代表物理单位所必需的TeX标记.这包括非破坏(稀疏)空格,\ text,\ mathrm等.对于纯文本输出,将\ frac {#1} {#2}之类的内容解析为#1 /#2也是很好的(和将MathJax用于HTML).由于我们目前已经拥有的系统,我需要能够从Python执行此操作,即理想情况下我正在寻找Python包,但我可以从Python调用非Python可执行文件并捕获输出字符串也没问题.
我知道在TeX StackExchange网站上有类似的问题,但是没有任何真正的程序化解决方案:我看过detex,plasTeX和pytex,他们看起来都有点死了,并没有真正做到我需要的是:将TeX字符串编程转换为代表性的纯文本字符串.
我可以尝试使用例如pyparsing来编写一个基本的TeX解析器,但是a)可能会陷入困境并得到帮助,并且b)肯定有人之前尝试过,或者知道一种方法来连接到TeX本身以获得更好的结果?
更新:感谢所有的答案......它确实看起来确实是一个尴尬的请求!我可以用少于一般的LaTeX解析来做,但是在循环中考虑解析器而不是加载正则表达式的原因是我希望能够很好地处理嵌套宏和多arg宏,并得到大括号匹配工作正常.然后我可以首先减少txt无关的宏,比如\ text和\ mathrm,并处理txt相关的宏,比如\ frac last ...甚至可以用合适的括号!好吧,我可以梦想...现在正则表达并没有做那么糟糕的工作.
在一个基于autotools的项目中,我正在捆绑另一个小的静态库,并以安全的方式将它链接到我的最终共享库(静态是用-fPIC等构建的)最后应该没有任何证据表明内部静态库的存在是构建过程的一部分,其符号应全部"复制"到共享库中.
最后一个条件肯定是满足的,检查过nm,并且ldd在共享库上使用显示没有"需要"的ELF部分依赖于静态库.但libtool的.la归档文件是一个不同的故事:dependency_libs那里的变量拿起一个-lmy-secret-temp-lib(名称已被更改以保护无辜)条目,然后破坏任何基于libtool的项目,该项目试图针对最终库构建,因为永远不能满足该依赖项.非libtool项目当然很好,因为libtool除了查看.la文件之外别无其他.
有什么方法可以告诉libtool 当它包含在dependency_libs变量中.la时,不将库添加到其文件中的xxxx_la_LIBADD变量中?也许有一些之前和之后的args喜欢-flibtool_ignore -lmy-secret-lib -flibtool_payattention让开发人员告诉libtool停止阻碍?很高兴能告诉autotools/libtool根本不制作/安装.la文件,但这似乎不是一个选择!
我想使用 Eigen3 库(版本 3.3.2)将元素添加到 Eigen::MatrixXd 对象的对角线上。
为了优化和能够使用常量,我想通过向原始矩阵添加对角矩阵来做到这一点,就像这样
const MatrixXd a(2,2); a << 1, 2, 3, 4;
const VectorXd v(2); v << 10, 20;
const MatrixXd b = a + v.asDiagonal();
Run Code Online (Sandbox Code Playgroud)
但这不起作用:我收到一个关于没有operator+. 添加两个MatrixXd确实有效,所以我希望它对对角线专业化表现得很好。
删除常量无济于事。使用静态大小的矩阵没有区别,所以它不是动态大小的事情。并且显式构造 aDiagonalMatrix而不是使用DiagonalWrapper返回的 byasDiagonal()也会给出相同的错误。
乘法对于这些类型是良构的:MatrixXd c = a * v.asDiagonal();编译和运行都很好。我做错了什么,还是operator+(Matrix,DiagonalMatrix)只是从图书馆里失踪了?
很多Boost的SFINAE助手都出现在带有C++ 11的std库中,但has_dereference似乎没有.除了这个功能,我已经设法从我的包中消除了Boost依赖,我想完全摆脱它,那么如何使用C++ 11 std功能获得相同的效果呢?
c++ ×3
python ×2
attributes ×1
boost ×1
c++11 ×1
docstring ×1
eigen ×1
eigen3 ×1
latex ×1
legacy-code ×1
libtool ×1
matrix ×1
namespaces ×1
parsing ×1
refactoring ×1
sfinae ×1
text ×1
type-traits ×1