小编zwo*_*wol的帖子

Javascript相当于Perl的\ Q ...\E或quotemeta()

在Perl正则表达式中,您可以使用\Q和包围子表达式,\E以指示您希望将子表达式匹配为文字字符串,即使其中存在元字符.您还可以使用quotemeta在字符串中插入正确数量的反斜杠的函数,这样,如果随后将该字符串插入到正则表达式中,则无论其内容是什么,它都将按字面匹配.

Javascript(在主流浏览器中部署)是否有任何内置的等价物?我可以自己写得很好,但我想知道我是否需要打扰.

javascript regex quotemeta

20
推荐指数
2
解决办法
5122
查看次数

在python 3中继承文件对象(以扩展打开和关闭操作)

假设我想在内部openclose时间使用额外的操作来扩展内置文件抽象.在Python 2.7中,这适用于:

class ExtFile(file):
    def __init__(self, *args):
        file.__init__(self, *args)
        # extra stuff here

    def close(self):
        file.close(self)
        # extra stuff here
Run Code Online (Sandbox Code Playgroud)

现在我正在考虑将程序更新为Python 3,其中open是一个工厂函数,它可能会从io模块中返回任何几个不同类的实例,具体取决于它的调用方式.我原则上可以将它们全部子类化,但这很乏味,而且我必须重新实现这样open做的调度.(在Python 3中,二进制文件和文本文件之间的区别比2.x更重要,我需要两者.)这些对象将被传递给库代码,这些代码可能与它们做任何事情,所以这些成语制作一个"类文件"的duck-typed类来包装返回值open和转发必要的方法将是最冗长的.

任何人都可以建议3.x方法,除了显示的2.x代码之外,尽可能少的额外样板吗?

python python-3.x

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

在JS中生成一个非常长的字符串(数十兆字节)的最有效方法

我发现自己需要在JavaScript中合成一个可笑的长字符串(如数十兆字节长).(这是为了将CSS选择器匹配操作减慢到可测量的时间点.)

我发现这样做的最好方法是

var really_long_string = (new Array(10*1024*1024)).join("x");
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有一种更有效的方法 - 首先不涉及创建数十兆字节的数组.

javascript

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

如果两种类型不相同,则导致C89中的编译错误

仅使用C89的功能

typedef [unspecified token sequence] T1;
typedef [another unspecified token sequence] T2;
Run Code Online (Sandbox Code Playgroud)

展示一种语言结构,当且仅当T1和T2是相同的类型(不仅仅是兼容的)时,它将无错误地编译.对C89的限制是因为这将进入autoconf探测器.

编辑:我需要一个解决方案,即使T1或T2或两者都是不完整的类型.很抱歉之前没有提到这个.

SON OF EDIT:所有三个当前答案仅检测兼容类型.事实证明这比我记忆中的"相同类型"更接近,足够接近我目前的目的,但出于好奇,我仍然在寻找能够检测到相同类型的答案.以下是一些兼容但不相同的类型:

typedef void (*T1)(void);
typedef void (*T2)();

typedef float T1[];
typedef float T2[12];

typedef enum { ONE, TWO, THREE } T1;
typedef /* implementation-defined integer type */ T2;
Run Code Online (Sandbox Code Playgroud)

c autoconf types

18
推荐指数
1
解决办法
483
查看次数

在SQLite中的一个语句中递增计数器或插入行

在SQLite中,给出了这个数据库模式

CREATE TABLE observations (
    src TEXT,
    dest TEXT,
    verb TEXT,
    occurrences INTEGER
);
CREATE UNIQUE INDEX observations_index
    ON observations (src, dest, verb);
Run Code Online (Sandbox Code Playgroud)

每当有一个新的观察元组(:src, :dest, :verb)出现时,我想要为该元组的现有行增加"出现次数"列,或者如果还没有,则添加一个出现次数= 1的新行.在具体的伪代码中:

if (SELECT COUNT(*) FROM observations
        WHERE src == :src AND dest == :dest AND verb == :verb) == 1:
    UPDATE observations SET occurrences = occurrences + 1
        WHERE src == :src AND dest == :dest AND verb == :verb
else:
    INSERT INTO observations VALUES (:src, :dest, :verb, 1)
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以在一个SQLite语句中执行整个操作.这将简化应用程序逻辑(这需要与数据库操作完全异步),并且还避免使用完全相同的密钥进行双索引查找.INSERT OR REPLACE似乎不是我想要的,唉没有UPDATE …

sql sqlite query-optimization

15
推荐指数
2
解决办法
9806
查看次数

带参数的宏

假设我使用参数定义宏,然后按如下方式调用它:

#define MIN(x,y) ((x)<(y)?(x):(y))
int x=1,y=2,z;
z=MIN(y,x);
Run Code Online (Sandbox Code Playgroud)

鉴于(a)宏作为文本替换,(b)这里的实际args就像正式args,只交换, - 这个特定的z = MIN(y,x)是否按预期工作?如果会的话,为什么?我的意思是,预处理器如何管理不混淆实际和正式的args?

这个问题是关于C编译器的技术问题.这不是c ++问题.
这个问题不建议任何人使用宏.
这个问题与编程风格无关.

c

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

在Python 2中_Exact_等效于`b'...'.decode("utf-8","backslashreplace")`

在Python 3.5+ .decode("utf-8", "backslashreplace")中,处理部分Unicode,部分未知的遗留编码二进制字符串是一个非常好的选择.将解码有效的UTF-8序列,并将无效的序列保留为转义序列.例如

>>> print(b'\xc2\xa1\xa1'.decode("utf-8", "backslashreplace"))
¡\xa1
Run Code Online (Sandbox Code Playgroud)

这就失去了b'\xc2\xa1\xa1'和之间的区别b'\xc2\xa1\\xa1',但是如果你在"只是给我一些不太有损的东西,以后我可以手工修理"的心态,那可能就行了.

但是,这是Python 3.5中的一项新功能.我正在研究的程序也需要支持3.4和2.7.在这些版本中,它会抛出异常:

>>> print(b'\xc2\xa1\xa1'.decode("utf-8", "backslashreplace"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
TypeError: don't know how to handle UnicodeDecodeError in error callback
Run Code Online (Sandbox Code Playgroud)

我找到了一个近似值,但不是一个确切的等价物:

>>> print(b'\xc2\xa1\xa1'.decode("latin1")
...       .encode("ascii", "backslashreplace").decode("ascii"))
\xc2\xa1\xa1
Run Code Online (Sandbox Code Playgroud)

行为不依赖于解释器版本是非常重要的.任何人都可以建议的方式来获得精确地在2.7和3.4的Python 3.5的行为?

(2.x或3.x的旧版本不需要工作.猴子修补codecs是完全可以接受的.)

python encoding backwards-compatibility python-2.7 python-3.x

14
推荐指数
1
解决办法
1594
查看次数

警告不是编译时间常数的函数参数

假设我正在维护一个接受两个参数(两个指针)的库函数。第二个参数仅是为了向后兼容而存在。调用者应始终传递NULL。我想在我的头文件中放入一些内容,如果第二个参数不是编译时常量NULL,则会使编译器发出警告。我以为我可以使用GCC __builtin_constant_p__attribute__((warning))扩展名来做到这一点:

extern void thefun_called_with_nonnull_arg (void)
    __attribute__((__warning__(
        "'thefun' called with second argument not NULL")));

extern int real_thefun (void *, void *);

static inline int
thefun (void *a, void *b)
{
   if (!__builtin_constant_p(b) || b != 0)
       thefun_called_with_nonnull_arg();
   return real_thefun(a, b);
}

int warning_expected (void *a, void *b)
{
    return thefun(a, b);
}
int warning_not_expected (void *a)
{
    return thefun(a, 0);
}
Run Code Online (Sandbox Code Playgroud)

但这不适用于我测试过的任何版本的GCC。两次致电我都会收到警告thefun。(编译器资源管理器演示。)

谁能建议一种替代构造,它会为warning_expected而不是发出警告warning_not_expected

笔记:

c gcc compiler-warnings

14
推荐指数
1
解决办法
174
查看次数

处理C/C++中的命令行标志

我正在寻找关于标志是什么的非常简单的解释/教程.我知道标志工作表明命令该做什么.例如:

rm -Rf test
Run Code Online (Sandbox Code Playgroud)

我知道rm命令将删除测试文件夹,并且-Rf标志将强制命令不仅删除文件夹而且删除其中的文件.

但是,标志读取/编译在哪里?处理旗帜的是什么?例如,我可以编写自己的C/C++程序并指定不同的标志,以便程序执行不同的操作吗?我希望我提出正确的问题.如果没有,请告诉我.

c unix command-line-arguments

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

包的相对导入__init__.py

假设我有一个包含两个子模块的包,并且__init__.py本身也包含大量代码:

pkg/__init__.py
pkg/foo.py
pkg/bar.py
Run Code Online (Sandbox Code Playgroud)

并且,为了使计划的未来重构更容易,我希望包的组件专门使用相对导入来相互引用.特别是,import pkg永远不应该出现.

foo.py我能做到

from __future__ import absolute_import
from . import bar
Run Code Online (Sandbox Code Playgroud)

访问bar.py模块,反之亦然.

问题是,我以__init__.py这种方式写什么来导入? 我想要完全相同的效果import pkg as local_name,只需要不必指定绝对名称pkg.

#import pkg as local_name
from . import ??? as local_name
Run Code Online (Sandbox Code Playgroud)

更新:受到maxymoo的回答的启发,我试过了

from . import __init__ as local_name
Run Code Online (Sandbox Code Playgroud)

这不会设置local_name为定义的模块__init__.py; 它取而代之的是看起来是该模块__init__ 方法的绑定方法包装器.我想我能做到

from . import __init__ as local_name
local_name = local_name.__self__
Run Code Online (Sandbox Code Playgroud)

得到我想要的东西,但(a)哎呀,(b)这让我担心模块还没有完全初始化.

答案需要在工作的Python 2.7和Python 3.4+.

是的,挖空可能会更好__init__.py …

python packages python-module

13
推荐指数
1
解决办法
1839
查看次数