在Perl正则表达式中,您可以使用\Q和包围子表达式,\E以指示您希望将子表达式匹配为文字字符串,即使其中存在元字符.您还可以使用quotemeta在字符串中插入正确数量的反斜杠的函数,这样,如果随后将该字符串插入到正则表达式中,则无论其内容是什么,它都将按字面匹配.
Javascript(在主流浏览器中部署)是否有任何内置的等价物?我可以自己写得很好,但我想知道我是否需要打扰.
假设我想在内部open和close时间使用额外的操作来扩展内置文件抽象.在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代码之外,尽可能少的额外样板吗?
我发现自己需要在JavaScript中合成一个可笑的长字符串(如数十兆字节长).(这是为了将CSS选择器匹配操作减慢到可测量的时间点.)
我发现这样做的最好方法是
var really_long_string = (new Array(10*1024*1024)).join("x");
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有一种更有效的方法 - 首先不涉及创建数十兆字节的数组.
仅使用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) 在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 …
假设我使用参数定义宏,然后按如下方式调用它:
#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 ++问题.
这个问题不建议任何人使用宏.
这个问题与编程风格无关.
在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
假设我正在维护一个接受两个参数(两个指针)的库函数。第二个参数仅是为了向后兼容而存在。调用者应始终传递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?
笔记:
我正在寻找关于标志是什么的非常简单的解释/教程.我知道标志工作表明命令该做什么.例如:
rm -Rf test
Run Code Online (Sandbox Code Playgroud)
我知道rm命令将删除测试文件夹,并且-Rf标志将强制命令不仅删除文件夹而且删除其中的文件.
但是,标志读取/编译在哪里?处理旗帜的是什么?例如,我可以编写自己的C/C++程序并指定不同的标志,以便程序执行不同的操作吗?我希望我提出正确的问题.如果没有,请告诉我.
假设我有一个包含两个子模块的包,并且__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 …
c ×4
python ×3
javascript ×2
python-3.x ×2
autoconf ×1
encoding ×1
gcc ×1
packages ×1
python-2.7 ×1
quotemeta ×1
regex ×1
sql ×1
sqlite ×1
types ×1
unix ×1