小编det*_*tly的帖子

Python memoising/deferred lookup属性装饰器

最近,我浏览了一个包含许多类的现有代码库,其中实例属性反映了存储在数据库中的值.我重构了很多这些属性,以便延迟数据库查找,即.不是在构造函数中初始化,而是仅在第一次读取时初始化.这些属性在实例的生命周期内不会发生变化,但它们是第一次计算的真正瓶颈,并且只在特殊情况下才真正访问过.因此,它们也可以在从数据库中检索后进行缓存(这因此符合记忆的定义,其中输入只是"无输入").

我发现自己一遍又一遍地为各种类的各种属性输入以下代码片段:

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包含了大量现成的装饰器之前,人们已经提出了这个问题.我更新了它只是为了更正术语.

python decorator

106
推荐指数
4
解决办法
3万
查看次数

在Git中,列出具有未提交提交的分支的名称

给定一个具有多个本地分支的项目,每个分支跟踪一些远程分支,是否有一个命令列出所有已经删除了提交的分支?(即使这些分支都没有签出,也就是这样.)

我不想看到提交本身,也不想看到最新的分支,我只是想看看哪些分支在他们的遥控器之前.

我试过了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]符合此标准?

git branch

45
推荐指数
4
解决办法
4585
查看次数

使用Python的C API创建对象

假设我的对象布局定义为:

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扩展中的某个位置创建新实例?

c python python-embedding python-c-api python-extensions

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

空列表中"全部"和"任何"结果的原因

在Python,内置的功能allany回报True,并False分别对空iterables.我意识到,如果是相反的方式,仍然可以问这个问题.但我想知道为什么选择这种特定的行为.它是任意的,即.它可能就像其他方式一样容易,还是有潜在的原因?

(我问的原因仅仅是因为我永远不会记得哪个是哪个,如果我知道它背后的理由那么我可能.还有,好奇心.)

python logic

28
推荐指数
4
解决办法
2374
查看次数

如何在标题后立即避免分页

我有一个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.但是,这在任何基于WebKitMozilla的浏览器中都不起作用.

html css page-break

25
推荐指数
3
解决办法
1万
查看次数

ParNew gc会阻止世界吗?

我看到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是否会停止所有线程.谢谢.

java garbage-collection

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

使用cProfile时返回值

我正在尝试分析一个实例方法,所以我做了类似的事情:

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命名的数据文件中,因此它们不会被破坏,我可以在以后组合它们.)

python

21
推荐指数
3
解决办法
7045
查看次数

"控制到达无效功能的结束"是什么意思?

我在这个二进制搜索算法上遇到了奇怪的编译器错误.我收到警告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)

c warnings compiler-warnings

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

免费的C99代码静态检查器

我正在寻找一个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)

c embedded gcc static-analysis c99

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

C移位表达式是否具有无符号类型?为什么夹板会警告右移?

对于以下程序:

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 >> E2E1右移位E2位置。如果E1具有无符号类型或E1具有符号类型和非负值,则结果的值是商E1除以数量2的幂的整数部分E2

此代码的主要目标是带有大多数C90编译器的嵌入式系统。但是,我对编写符合标准的代码感兴趣。我一直在以C99模式在GCC和Clang上进行测试,因此可以restrict正常工作。

我的问题是:

  1. C标准是否对移位结果的类型提出任何要求?
  2. 做编译器吗?
  3. 如果不是,为什么夹板会发出此警告?

c code-analysis splint bit-shift language-lawyer

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