小编for*_*ran的帖子

如何将命令的输出分配给Makefile变量

我需要有条件地执行一些make规则,只要安装的Python大于某个版本(比如2.5).

我以为我可以做一些像执行:

python -c 'import sys; print int(sys.version_info >= (2,5))'
Run Code Online (Sandbox Code Playgroud)

然后在ifeqmake语句中使用输出(如果正常则为"1",否则为"0").

在一个简单的bash shell脚本中,它只是:

MY_VAR=`python -c 'import sys; print int(sys.version_info >= (2,5))'`
Run Code Online (Sandbox Code Playgroud)

但这在Makefile中不起作用.

有什么建议?我可以使用任何其他合理的解决方法来实现这一目标.

shell makefile

196
推荐指数
6
解决办法
14万
查看次数

查找与谓词匹配的序列中的第一个元素

我想要一种惯用的方法来查找列表中与谓词匹配的第一个元素.

目前的代码非常难看:

[x for x in seq if predicate(x)][0]
Run Code Online (Sandbox Code Playgroud)

我想过把它改成:

from itertools import dropwhile
dropwhile(lambda x: not predicate(x), seq).next()
Run Code Online (Sandbox Code Playgroud)

但是必须有一些更优雅的东西...... None如果没有找到匹配,如果它返回一个值而不是引发异常会很好.

我知道我可以定义一个函数:

def get_first(predicate, seq):
    for i in seq:
        if predicate(i): return i
    return None
Run Code Online (Sandbox Code Playgroud)

但是开始使用像这样的实用程序函数来填充代码是非常无味的(并且人们可能不会注意到它们已经存在,所以如果存在已经提供相同的内置函数,它们往往会随着时间的推移而重复).

python predicate

149
推荐指数
4
解决办法
8万
查看次数

如何在Eclipse中查看JRE的源代码?

使用Eclipse我想查看核心Java类的源代码(例如java.util.concurrent.ConcurrentHashMap),但是当我使用"Open Declaration"导航到源代码时,它会显示"Source not found"并给我选择附加源代码.

我的问题是; 我如何附加源?我从哪里获得java.util.concurrent图书馆的源.jar ?

java eclipse

84
推荐指数
5
解决办法
8万
查看次数

具有numpy的数组的高效阈值滤波器

我需要过滤一个数组来删除低于某个阈值的元素.我目前的代码是这样的:

threshold = 5
a = numpy.array(range(10)) # testing data
b = numpy.array(filter(lambda x: x >= threshold, a))
Run Code Online (Sandbox Code Playgroud)

问题是这会创建一个临时列表,使用带有lambda函数的过滤器(慢).

由于这是一个非常简单的操作,也许有一个numpy函数以有效的方式完成它,但我一直无法找到它.

我认为实现这一目标的另一种方法可能是对数组进行排序,找到阈值的索引并从该索引返回切片,但即使这对于小输入来说会更快(并且无论如何都不会引人注意) ),随着输入大小的增加,其最终渐近渐弱的效率.

有任何想法吗?谢谢!

更新:我也进行了一些测量,当输入为100.000.000个条目时,排序+切片仍然比纯python过滤器快两倍.

In [321]: r = numpy.random.uniform(0, 1, 100000000)

In [322]: %timeit test1(r) # filter
1 loops, best of 3: 21.3 s per loop

In [323]: %timeit test2(r) # sort and slice
1 loops, best of 3: 11.1 s per loop

In [324]: %timeit test3(r) # boolean indexing
1 loops, best of 3: 1.26 s per loop
Run Code Online (Sandbox Code Playgroud)

python numpy filter threshold

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

模拟Java枚举以添加值以测试失败案例

我有一个或多或少像这样的枚举开关:

public static enum MyEnum {A, B}

public int foo(MyEnum value) {
    switch(value) {
        case(A): return calculateSomething();
        case(B): return calculateSomethingElse();
    }
    throw new IllegalArgumentException("Do not know how to handle " + value);
}
Run Code Online (Sandbox Code Playgroud)

并且我希望测试涵盖所有行,但由于代码应该处理所有可能性,因此我无法在交换机中提供没有相应case语句的值.

扩展枚举以添加额外的值是不可能的,只是模拟返回的equals方法false将无法工作,因为生成的字节码使用窗帘后面的跳转表来找到正确的情况......所以我想也许用PowerMock可以实现一些黑魔法.

谢谢!

编辑:

由于我拥有枚举,我认为我可以只为值添加一个方法,从而完全避免切换问题; 但是我要离开这个问题,因为它仍然很有趣.

java enums unit-testing code-coverage mocking

50
推荐指数
3
解决办法
5万
查看次数

Python类中的属性初始化/声明:放置它们的位置?

我想知道在Python中,在类的主体或__init__函数内部初始化对象属性的最佳实践是什么?

class A(object):
    foo = None
Run Code Online (Sandbox Code Playgroud)

VS

class A(object):
   def __init__(self):
       self.foo = None
Run Code Online (Sandbox Code Playgroud)

python attributes coding-style

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

什么是URL参数?(urlparse结果中#3位置的元素)

我已经看了一下urlparse.urlparse方法文档,我对这个parameters部分有点困惑(不要与更熟悉的query部分混淆,那就是在问号之后和片段部分之前).

关于URL结构的维基百科条目没有说明这一点,所以可以请任何人详细说明这一点并可能举一些例子吗?

python url url-parameters urlparse

39
推荐指数
2
解决办法
6218
查看次数

ANSI C中的parens表达式包含复合语句(块)吗?

浏览Linux内核源代码时,我发现了一段代码,其中括号括起来的语句块被视为表达式a laisp(或ML),即表达式,其值是最后一个语句的值.

例如:

int a = ({
    int i;
    int t = 1;
    for (i = 2; i<5; i++) {
        t*=i;
    }
    t;
});
Run Code Online (Sandbox Code Playgroud)

我一直在研究ANSI C语法,试图弄清楚这段代码如何适合解析树,但我还没有成功.

那么,有没有人知道这种行为是由标准规定还是只是GCC的特殊性?

更新:我已尝试使用标志-pedantic,编译器现在给我一个警告:

warning: ISO C forbids braced-groups within expressions
Run Code Online (Sandbox Code Playgroud)

c standards gcc expression

37
推荐指数
2
解决办法
7507
查看次数

Code-golf:生成pascal的三角形

生成一个列表列表(或打印,我不介意)一个大小为N 的Pascal三角形,代码可能最少!

这是我的尝试(使用技巧python 2.6中的 118个字符):

c,z,k=locals,[0],'_[1]'
p=lambda n:[len(c()[k])and map(sum,zip(z+c()[k][-1],c()[k][-1]+z))or[1]for _ in range(n)]
Run Code Online (Sandbox Code Playgroud)

说明:

  • 列表理解的第一个元素(当长度为0时)是 [1]
  • 下一个元素是通过以下方式获得的:
  • 取前面的列表并制作两个列表,一个在开头填充0,在结尾填充另一个.
    • 例如,对于第二步,我们采取[1]并制造[0,1][1,0]
  • 按元素对两个新列表求和
    • 例如,我们制作一个新的列表[(0,1),(1,0)]并用sum来映射.
  • 重复n次,就是这样.

用法(漂亮的打印,实际上是代码-golf xD):

result = p(10)
lines = [" ".join(map(str, x)) for x in result]
for i in lines:
    print i.center(max(map(len, lines)))
Run Code Online (Sandbox Code Playgroud)

输出:

             1             
            1 1            
           1 2 1           
          1 3 3 1          
         1 4 6 4 1         
       1 5 10 10 5 1       
      1 6 15 20 …
Run Code Online (Sandbox Code Playgroud)

algorithm code-golf combinatorics discrete-mathematics pascals-triangle

37
推荐指数
6
解决办法
7103
查看次数

扩展默认的nginx mime.types文件

我想为nginx mime类型添加一些额外的类型,但我不想编辑默认值, /etc/nginx/mime.types因为它会为部署过程增加一些额外的复杂性.

如果我向我添加一个types {...}部分,nginx.conf它将覆盖用声明的所有其他类型include mime.types;.

我认为我可以为我需要处理的文件的扩展编写一个位置规则,但我想必须有一种更清晰的方法来实现这一点.

nginx mime-types

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