最近,我浏览了一个包含许多类的现有代码库,其中实例属性反映了存储在数据库中的值.我重构了很多这些属性,以便延迟数据库查找,即.不是在构造函数中初始化,而是仅在第一次读取时初始化.这些属性在实例的生命周期内不会发生变化,但它们是第一次计算的真正瓶颈,并且只在特殊情况下才真正访问过.因此,它们也可以在从数据库中检索后进行缓存(这因此符合记忆的定义,其中输入只是"无输入").
我发现自己一遍又一遍地为各种类的各种属性输入以下代码片段:
class testA(object):
def __init__(self):
self._a = None
self._b = None
@property
def a(self):
if self._a is None:
# Calculate the attribute now
self._a = 7
return self._a
@property
def b(self):
#etc
Run Code Online (Sandbox Code Playgroud)
是否有现成的装饰器已经在Python中执行此操作,我根本不知道?或者,是否有一种相当简单的方法来定义装饰器来执行此操作?
我在Python 2.5下工作,但如果它们有显着差异,2.6答案可能仍然很有趣.
在Python包含了大量现成的装饰器之前,人们已经提出了这个问题.我更新了它只是为了更正术语.
给定一个具有多个本地分支的项目,每个分支跟踪一些远程分支,是否有一个命令列出所有已经删除了提交的分支?(即使这些分支都没有签出,也就是这样.)
我不想看到提交本身,也不想看到最新的分支,我只是想看看哪些分支在他们的遥控器之前.
我试过了git log --branches --not --remotes --simplify-by-decoration --decorate --oneline,但它似乎没有显示我需要的东西.在我当前的repo上运行它没有输出,但git status在我当前的分支上运行显示Your branch is ahead of 'origin/branchname' by 2 commits.
git for-each-ref --format="%(refname:short) %(push:track)" refs/heads并且git branch -v都显示最新的分支以及需要推送的分支.然而,他们也都显示我的当前分支的[ahead 2].
我发现的其他命令,例如.git log @{u}..,git cherry -v列出提交本身,而不是分支.
附带问题:为什么输出git log --branches --not --remotes --simplify-by-decoration --decorate --oneline不包括git branch -v显示为前方的分支?前命令不仅仅是看哪个refs/heads不对应已知的遥控器; 那么列出的分支是否[ahead 2]符合此标准?
假设我的对象布局定义为:
typedef struct {
PyObject_HEAD
// Other stuff...
} pyfoo;
Run Code Online (Sandbox Code Playgroud)
...和我的类型定义:
static PyTypeObject pyfoo_T = {
PyObject_HEAD_INIT(NULL)
// ...
pyfoo_new,
};
Run Code Online (Sandbox Code Playgroud)
如何pyfoo在C扩展中的某个位置创建新实例?
我有一个HTML 4.01/CSS 2.1文档,其中包含一个H3标题,后跟一个短(一行)段落块,然后是一个包含多个项目的无序列表:
<h3>Heading!</h3>
<p>Some things:</p>
<ul>
<li>Thing one</li>
<li>Thing B</li>
<li>Thing 4</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我打印文档(或使用PDF渲染它wkhtmltopdf)时,有时会在标题之后,在段落之前发生分页,这看起来很傻.
有没有办法规定在标题后应立即避免分页?(我不反对HTML5/CSS3解决方案,如果这大大简化了事情.)
注意:以下建议,我尝试使用CSS属性page-break-after: avoid.但是,这在任何基于WebKit或Mozilla的浏览器中都不起作用.
我看到GC输出如下:
2010-12-10T16:00:44.942+0800: 1443.562: [GC 1443.562: [ParNew: 201856K->17318K(201856K), 0.0352970 secs] 2113334K->1949037K(4416748K) icms_dc=0 , 0.0354310 secs] [Times: user=0.12 sys=0.00, real=0.04 secs]
2010-12-10T16:00:46.207+0800: 1444.827: [GC 1444.827: [ParNew: 196774K->22400K(201856K), 0.0119290 secs] 2128493K->1954446K(4416748K) icms_dc=0 , 0.0120560 secs] [Times: user=0.13 sys=0.00, real=0.02 secs]
2010-12-10T16:00:47.562+0800: 1446.182: [GC 1446.182: [ParNew: 201856K->22400K(201856K), 0.0714350 secs] 2133902K->1982695K(4416748K) icms_dc=0 , 0.0715720 secs] [Times: user=0.23 sys=0.01, real=0.07 secs]
2010-12-10T16:00:48.545+0800: 1447.165: [GC 1447.165: [ParNew: 201856K->22400K(201856K), 0.1457230 secs] 2162151K->2008418K(4416748K) icms_dc=0 , 0.1458710 secs] [Times: user=0.71 sys=0.05, real=0.15 secs]
Run Code Online (Sandbox Code Playgroud)
我想知道ParNew GC是否会停止所有线程.谢谢.
我正在尝试分析一个实例方法,所以我做了类似的事情:
import cProfile
class Test():
def __init__(self):
pass
def method(self):
cProfile.runctx("self.method_actual()", globals(), locals())
def method_actual(self):
print "Run"
if __name__ == "__main__":
Test().method()
Run Code Online (Sandbox Code Playgroud)
但是现在当我希望"method"返回由"method_actual"计算的值时出现问题.我真的不想两次调用"method_actual".
还有其他方法,可以线程安全吗?(在我的应用程序中,cProfile数据被保存到由其中一个args命名的数据文件中,因此它们不会被破坏,我可以在以后组合它们.)
我在这个二进制搜索算法上遇到了奇怪的编译器错误.我收到警告control reaches end of non-void function.这是什么意思?
int binary(int val, int sorted[], int low, int high) {
int mid = (low+high)/2;
if(high < low)
return -1;
if(val < sorted[mid])
return binary(val, sorted, low, mid-1);
else if(val > sorted[mid])
return binary(val, sorted, mid+1, high);
else if(val == sorted[mid])
return mid;
}
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个C99代码(包括GCC扩展)的免费静态检查器,能够明确地说"这些预处理器宏总是被定义".
我需要最后一部分,因为我正在为单个目标处理器编译嵌入式代码.编译器(Microchip的C32,基于GCC)根据所选处理器设置宏,然后在PIC32头文件中使用该宏来选择要包含的特定于处理器的头文件.因此,cppcheck失败是因为它检测到#ifdef用于选择许多可能的PIC32处理器之一的30个不同的s,尝试分析这些加上所有其他#defines的所有可能组合,并且失败.
例如,如果splint可以处理C99代码,我会使用
splint -D__PIC32_FEATURE_SET__=460 -D__32MX460F512L__ \
-D__LANGUAGE_C__ -I/path/to/my/includes source.c
Run Code Online (Sandbox Code Playgroud)
另一个问题是PIC32工具链编译器被调用pic32-gcc而不仅仅是gcc,尽管我还没有达到需要考虑这个问题的程度.
更新#1 - 我感兴趣的一件事,但与这个问题正交,是Eclipse集成(不必为30多个编译单元编写一个makefile很好).我在Eclipse论坛上询问过这个问题(虽然讨论的内容更多是关于Eclipse的集成).没有什么是开创性的.
更新#2 -只是试图scan-build从铛,使用:
scan-build --use-cc=/usr/local/bin/pic32-gcc make -B -k all
Run Code Online (Sandbox Code Playgroud)
...(也没有--use-cc标志)但我得到的只是典型的构建输出,其中一个例子是:
Building file: ../src/MoreMath.c
Invoking: PIC C32 C Compiler
pic32-gcc -D__DEBUG -I/usr/local/pic32-libs/include -O0 -Wall -c -fmessage-length=0 -std=gnu99 -Werror-implicit-function-declaration -MMD -MP -MF"src/MoreMath.d" -MT"src/MoreMath.d" -mprocessor=32MX460F512L -D__DEBUG -g -o"src/MoreMath.o" "../src/MoreMath.c"
Finished building: ../src/MoreMath.c
Run Code Online (Sandbox Code Playgroud)
......最后:
Building target: MyBinary.elf
Invoking: PIC C32 C …Run Code Online (Sandbox Code Playgroud) 对于以下程序:
int main(void)
{
int value = 2;
int result = value >> 1U;
return result;
}
Run Code Online (Sandbox Code Playgroud)
... Splint 3.1.2给出警告:
splint_test.c: (in function main)
splint_test.c:4:18: Variable result initialized to type unsigned int, expects
int: value >> 1U
To ignore signs in type comparisons use +ignoresigns
Run Code Online (Sandbox Code Playgroud)
Splint似乎声称有符号整数右移的表达式具有无符号整数的类型。但是,我可以在ANSI C90标准中找到的全部是:
结果
E1 >> E2是E1右移位E2位置。如果E1具有无符号类型或E1具有符号类型和非负值,则结果的值是商E1除以数量2的幂的整数部分E2。
此代码的主要目标是带有大多数C90编译器的嵌入式系统。但是,我对编写符合标准的代码感兴趣。我一直在以C99模式在GCC和Clang上进行测试,因此可以restrict正常工作。
我的问题是: