小编mat*_*ots的帖子

CPython使用什么解析器生成器?

我正在阅读文档中的这个页面,并注意到它说

这是完整的Python语法,因为它由解析器生成器读取并用于解析Python源文件

但是,我很难找到CPython使用的解析器生成器.那么CPython使用什么解析器生成器呢?是否有其他解析器生成器可以在该页面上进行语法而不进行任何修改?

python parsing parser-generator asdl

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

光滑的方式来反转Python中数字的(二进制)数字?

我正在寻找一个光滑的函数,它反转数字的二进制表示的数字.

如果f我有这样的功能

int(reversed(s),2) == f(int(s,2)) 每当s是一串零,一个以1开头.

现在我正在使用 lambda x: int(''.join(reversed(bin(x)[2:])),2)

就简洁而言,这是好的,但这似乎是一种相当迂回的方式.

我想知道是否有一个更好的(也许更快)的方式与位运算符,什么不是.

python algorithm bit-manipulation

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

在Ruby中撤消zip

在Python中,我可以通过回放zip来获得zip的"反转"

a = [1,2,3]
b = [4,5,6]
c = zip(a,b) # [(1,4),(2,5),(3,6)]
Run Code Online (Sandbox Code Playgroud)

相反,如果我开始c,我可以ab回用下面的

c = [(1,4),(2,5),(3,6)]
a, b = zip(*c)
Run Code Online (Sandbox Code Playgroud)

但是,在Ruby中,似乎只有一种zip方法,因此我不确定我能以完全相同的方式做到这一点......

在Ruby中是否有某种类似的好习惯用于"解压缩"列表列表?


我知道你可以做到

c[0].zip(*c[1..-1])
Run Code Online (Sandbox Code Playgroud)

基本上在语义上是相同的东西,但这种方式看起来并不那么直观......

ruby

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

模板类方法不会导致错误 - 这是标准的一部分吗?

当我编译以下内容时g++ --std=c++98 -Wall -Werror -Wpedantic Test.cc,没有错误.

template <class T>
struct TemplateClass {
  T *ptr;

  TemplateClass(T *p): ptr(p) {}

  int foo() {
    return ptr->bar();
  }
};

struct ExampleClass {
};

int main() {
  TemplateClass<ExampleClass> x(new ExampleClass());
}
Run Code Online (Sandbox Code Playgroud)

我预计编译器会抱怨ExampleClass没有实现方法bar.

但看起来它只是抱怨我实际使用的方法foo.

我可以在任何符合C++ 98和C++ 11的编译器上依赖此行为吗?

我之前对模板的理解是,无论何时实例化模板,都会复制整个主体并T替换为模板参数.这不是模板的工作原理吗?

c++ templates c++11

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

使用 Pythoncurses 自定义 RGB 颜色

curses我正在使用标准库中的模块用 Python 编写程序。

我希望我的程序在无法使用我用 RGB 三元组指定的自定义颜色时退出。

所以我有一些起始代码,如下所示:

import curses

def main(stdscr):
  if not curses.can_change_color():
    raise Exception('Cannot change color')

  curses.init_color(curses.COLOR_BLACK, 999,   0,   0)
  curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_WHITE)
  curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_BLACK)
  stdscr.addstr('hello', curses.color_pair(1))
  stdscr.addstr(' world', curses.color_pair(2))
  stdscr.getch()

curses.wrapper(main)
Run Code Online (Sandbox Code Playgroud)

我得到的结果是:

在此输入图像描述

我预计黑色会被红色取代。

我是否误解了文档?我怎样才能curses尊重我想要使用的自定义 RGB 颜色?或者至少失败并告诉我终端不支持它?

这里的curses 文档似乎表明,如果失败,它将返回一个错误,并且CPython 源代码似乎非常忠实地传播curses 错误

如果相关的话,我使用的是 OS X 10.11,并且正在使用 Homebrew 安装的 Python3 上进行测试。但我使用 OS X 的内置 Python 解释器也得到了同样的效果。

编辑:

稍微修改示例代码以显示颜色内容:

import curses

def main(stdscr):
  if not curses.can_change_color():
    raise Exception('Cannot change color')

  stdscr.addstr(1, 0, …
Run Code Online (Sandbox Code Playgroud)

python curses ncurses

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

如何在 Python 上使用 Xlib 模拟鼠标点击

出于教育目的,我开始使用 编写一个 python 脚本cwiidXlib以便我可以像使用鼠标一样使用我的 Wiimote。

到目前为止,我已经通过调用disp.warp_pointer(dx,dy)然后调用disp.sync()每个设置的时间间隔来移动光标。恐怕这可能不是最有效的方法,但至少目前来说,它很简单并且效果很好。

我遇到的更困难的问题是鼠标点击。如何在 Xlib 中模拟鼠标单击?我想要单独的新闻和发布活动,以便我可以拖放内容。我看过这篇文章,但那里的所有解决方案似乎都使​​用其他库。

python xlib wiimote

5
推荐指数
2
解决办法
4696
查看次数

限制Python导入的范围

我有一些看起来像这样的代码:

from pyparsing import Word, alphas, Optional, ...
# Do stuff ...
# And at the end, save a result to the outside world.
parser = ...

# Now use parser but don't use anything else from pyparsing again.
Run Code Online (Sandbox Code Playgroud)

我喜欢调用方便from <package> import <etc>,但我只想在很小的代码段中使用它.我担心我会对命名空间污染做出贡献,因为我在同一个文件中有很多像这样的小片段.

什么是Pythonic处理这种情况的方法?我仍然只是在玩它,所以我宁愿不写这么多pyparsing.次.

python namespaces

5
推荐指数
2
解决办法
2768
查看次数

dict.pop()如何检测是否已传递可选参数?

d = dict()
d.pop('hello', None) # No exception thrown
d.pop('hello', 0)    # No exception thrown
d.pop('hello')       # KeyError
Run Code Online (Sandbox Code Playgroud)

我原以为在Python中我们通常通过使用某种默认值测试参数来测试是否传递了默认参数.

我想不出任何其他dict.pop可能使用的"自然"默认值.

是否正在dict.pop使用其他方法来测试可选参数?或者它是否使用更深奥的默认值?

python

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

拦截heapq

我想使用Python的heapq模块.但是,我需要跟踪每个值设置的索引.

所以我写了

class heap(list):       
    def __init__(self,xs):
        super(heap,self).__init__(xs)
        self._index_table = {x:i for i,x in enumerate(self)}

    def __setitem__(self,i,v):
        print(i,v)
        super(heap,self).__setitem__(i,v)
        self._index_table[v] = i

    def append(self,x):
        super(heap,self).append(x)
        self._index_table[x] = len(self)-1

from heapq import heapify, heappush, heappop, _siftdown, _siftup

h = heap([4,3,2,1])
heapify(h)
heappush(h,12)
print(h)
print(h._index_table)
Run Code Online (Sandbox Code Playgroud)

这打印

[1, 3, 2, 4, 12]
{1: 3, 2: 2, 3: 1, 4: 0}
Run Code Online (Sandbox Code Playgroud)

heapifyheappush修改了我的列表中的条目,绕过了我捕获所有作业的尝试.

为什么会这样?有没有解决的办法?还有一种方法可以使用heapq模块并仍然跟踪每个值对应的索引吗?

编辑:

看起来我的代码有一条heapify(h)我在原帖中没有的行.修正了这一点

python heap

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

C++ gmp和homebrew

我在Mac上,我已安装gccgmp通过homebrew.

为了测试我的安装,我从这里尝试了一个简单的例子:

#include <iostream>
#include <gmpxx.h>
using namespace std;
int
main (void)
{
mpz_class a, b, c;

a = 1234;
b = "-5678";
c = a+b;
cout << "sum is " << c << "\n";
cout << "absolute value is " << abs(c) << "\n";

return 0;
}
Run Code Online (Sandbox Code Playgroud)

首先,如果我试着g++ test.cpp -lgmpxx -lgmp抱怨

test.cpp:9:19: fatal error: gmpxx.h: No such file or directory
 #include <gmpxx.h>
                   ^
compilation terminated.
Run Code Online (Sandbox Code Playgroud)

所以我试过了 g++ test.cpp -lgmpxx …

c++ homebrew gmp

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