在Python中是否有一种标准方法来规范化unicode字符串,以便它只能理解可用于表示它的最简单的unicode实体?
我的意思是,一些东西,想翻译的顺序['LATIN SMALL LETTER A', 'COMBINING ACUTE ACCENT']
来['LATIN SMALL LETTER A WITH ACUTE']
?
看看问题出在哪里:
>>> import unicodedata
>>> char = "á"
>>> len(char)
1
>>> [ unicodedata.name(c) for c in char ]
['LATIN SMALL LETTER A WITH ACUTE']
Run Code Online (Sandbox Code Playgroud)
但现在:
>>> char = "a?"
>>> len(char)
2
>>> [ unicodedata.name(c) for c in char ]
['LATIN SMALL LETTER A', 'COMBINING ACUTE ACCENT']
Run Code Online (Sandbox Code Playgroud)
当然,我可以迭代所有字符并进行手动替换等,但效率不高,我很确定我会错过一半的特殊情况,并且会犯错误.
我正在尝试在Python 3.3中使用一个旧库(可追溯到2003年!).当我导入它时,Python会抛出一个错误,因为<>
源文件中有迹象,例如:
if (cnum < 1000 and nnum <> 1000 and ntext[-1] <> "s":
...
Run Code Online (Sandbox Code Playgroud)
我想这是一个现在被遗弃的语言标志.
究竟是什么意思,我应该用哪个(更近期的)标志替换它?
我正在使用new _Generic
关键字进行一些实验,偶然发现了一个关于多个评估的特殊情况.请参阅以下内容:
#include <stdio.h>
#define write_char(c) _Generic(c, char: putchar, const char: putchar)(c)
int main(void)
{
const char *s = "foo";
write_char(*s++);
write_char(*s++);
write_char(*s++);
putchar('\n');
}
Run Code Online (Sandbox Code Playgroud)
这个编译很好并且用GCC产生预期的结果:
$ gcc -std=c11 -Wall plusplus.c -o plusplus
$ ./plusplus
foo
Run Code Online (Sandbox Code Playgroud)
另一方面,Clang输出了一个很大的鸣笛警告:
$ clang -std=c11 plusplus.c -o plusplus
plusplus.c:9:18: warning: multiple unsequenced modifications to 's'
[-Wunsequenced]
write_char(*s++);
^~
plusplus.c:3:32: note: expanded from macro 'write_char'
#define write_char(c) _Generic(c, char: putchar, const char: putchar)(c)
...
Run Code Online (Sandbox Code Playgroud)
结果如预期:
$ ./plusplus
foo
Run Code Online (Sandbox Code Playgroud)
我检查了标准草案,该草案说明(PDF格式第97页):
不评估通用选择的控制表达式.
这似乎准确地解决了宏中的副作用问题(例如,MIN
和 …
我想stdout
在python(3)脚本中捕获shell命令的流,并且能够同时检查shell命令的返回代码,如果它返回错误(即,如果它的返回代码是不是0).
subprocess.check_output
似乎是这样做的合适方法.来自subprocess
的手册页:
check_output(*popenargs, **kwargs)
Run command with arguments and return its output as a byte string.
If the exit code was non-zero it raises a CalledProcessError. The
CalledProcessError object will have the return code in the returncode
attribute and output in the output attribute.
Run Code Online (Sandbox Code Playgroud)
但是,当它失败时,我没有成功从shell命令获取返回码.我的代码看起来像这样:
import subprocess
failing_command=['ls', 'non_existent_dir']
try:
subprocess.check_output(failing_command)
except:
ret = subprocess.CalledProcessError.returncode # <- this seems to be wrong
if ret in (1, 2):
print("the command failed")
elif ret in (3, 4, …
Run Code Online (Sandbox Code Playgroud) 我注意到有一段时间,read
如果没有文件的最后一行,那么它最后就不会读取一个"换行符".如果考虑到这一点,这是可以理解的,只要文件中没有"换行"字符,就好像它包含0行(这很难承认!).例如,请参阅以下内容:
$ echo 'foo' > bar ; wc -l bar
1 bar
Run Code Online (Sandbox Code Playgroud)
但...
$ echo -n 'bar' > foo ; wc -l foo
0 foo
Run Code Online (Sandbox Code Playgroud)
那么问题是:当我使用read
处理尚未由我自己创建或修改的文件时,如何处理这种情况,以及我不知道它们是否真的以"换行符"结尾?
我最近意识到strip
的Python(和它的孩子们的内置rstrip
和lstrip
)不治疗是给予它作为参数作为一个字符的有序序列串,而是作为一种字符的"蓄水池"的:
>>> s = 'abcfooabc'
>>> s.strip('abc')
'foo'
>>> s.strip('cba')
'foo'
>>> s.strip('acb')
'foo'
Run Code Online (Sandbox Code Playgroud)
等等.
有没有办法从给定的字符串中删除有序子字符串,以便在上面的示例中输出会有所不同?
我需要分配几个相同类型和形状的数组.一开始,我做了类似的事情:
void alloc_arrays_v1(size_t nmemb)
{
int *a1, *a2, *a3;
a1 = malloc(nmemb * sizeof int);
a2 = malloc(nmemb * sizeof int);
a3 = malloc(nmemb * sizeof int);
/* do some stuff with the arrays */
free(a1);
free(a2);
free(a3);
}
Run Code Online (Sandbox Code Playgroud)
为了避免调用malloc
,并free
好几次,我换到上述情况:
void alloc_arrays_v2(size_t nmemb)
{
int *a, *a1, *a2, *a3;
a = malloc(3 * nmemb * sizeof int);
a1 = a;
a2 = a1 + nmemb;
a3 = a2 + nmemb;
/* do some stuff */
free(a); …
Run Code Online (Sandbox Code Playgroud) 这个问题与文本编辑有关。假设您有一段标准化形式的NFC文本,以及一个指向文本中扩展字素簇边界的光标。您想在光标位置插入另一段文本,并确保生成的文本也在 NFC 中。您还希望将光标移动到紧跟在插入文本之后的第一个字素边界上。
现在,由于连接两个都在 NFC 中的字符串不一定会生成也在 NFC 中的字符串,因此您可能需要修改插入点周围的文本。例如,如果您有一个包含 4 个代码点的字符串,如下所示:
[0] LATIN SMALL LETTER B
[1] LATIN SMALL LETTER E
[2] COMBINING MACRON BELOW
--- Cursor location
[3] LATIN SMALL LETTER A
Run Code Online (Sandbox Code Playgroud)
并且您想{COMBINING ACUTE ACCENT, COMBINING DOT ABOVE}
在光标位置插入一个 2-codepoints 字符串。那么结果将是:
[0] LATIN SMALL LETTER B
[1] LATIN SMALL LETTER E WITH ACUTE
[2] COMBINING MACRON BELOW
[3] COMBINING DOT ABOVE
--- Cursor location
[4] LATIN SMALL LETTER A
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:在插入字符串后,您如何确定应该将光标放置在哪个偏移量处,从而使光标在插入的字符串之后结束并位于字素边界上?在这种特殊情况下,在标准化期间,光标位置后面的文本不可能与前面的文本交互。因此,以下示例 Python 代码将起作用:
import unicodedata
def …
Run Code Online (Sandbox Code Playgroud) 我注意到了一个(看似)奇怪的分配行为,这让我多次犯了编程错误.
首先参见以下示例:
>>> i = 0
>>> t = (i,)
>>> t
(0,)
>>> i += 1
>>> t
(0,)
Run Code Online (Sandbox Code Playgroud)
正如所料,t
即使在增加值之后,唯一元素的值也不会改变i
.
现在看到以下内容:
>>> l = [0]
>>> t = (l,)
>>> t
([0],)
>>> l[0] += 1
>>> t
([1],) # <- ?
Run Code Online (Sandbox Code Playgroud)
我不明白为什么最初的零t
现在是一个; 如果我通过引用增加它t
...
>>> t[0][0] += 1
Run Code Online (Sandbox Code Playgroud)
...我知道它的值已经改变了,但在前面的例子中并非如此,其中只有l
在递增时才显式引用.
我有两个问题:
我已经看到很多C库没有在内部处理它们作为不同类型的对象,而是在让你访问它们之前用void指针包装它们.在实践中,"私有"源文件看起来像:
typedef struct {
int value;
} object;
void * object_new(void)
{
object *o = malloc(sizeof(object));
o->value = 1;
return o;
}
int object_get(void *o)
{
return (object *)o->value;
}
void * object_free(void *o)
{
free(o);
}
Run Code Online (Sandbox Code Playgroud)
在主标题中你只有:
void * object_new(void);
int object_get(void *o);
void * object_free(void *o);
Run Code Online (Sandbox Code Playgroud)
现在我想知道:他们这样做有什么特别的原因吗?如果想要确保API用户无法访问对象的内部,仅仅在主库头中公开类型名称并隐藏底层结构的详细信息(或者其他任何内容)是不够的.实际文件中的实际对象?
我经常看到这种代码:
filecontent = open(thefilename).read()
Run Code Online (Sandbox Code Playgroud)
我想知道open
在这种情况下创建的文件对象是什么:它是隐式关闭的,还是在某个地方保持打开状态?
我有一个看起来像这样的字符串:
STRING="$PATTERN_some-stuff_$PATTERN_some-other_stuff"
Run Code Online (Sandbox Code Playgroud)
我想仅使用 Bash 内置命令来计算其中出现的次数$PATTERN
。
到目前为止,我发现的更直接的方法是从字符串中仅提取匹配的字符串$PATTERN
,然后计算$PATTERN
新创建的字符串中出现了多少次,按以下方式进行:
expr length "${STRING//[^$PATTERN]}" / ${#PATTERN}
Run Code Online (Sandbox Code Playgroud)
但它仅适用于$PATTERN
单个字符。我尝试使用语法${STRING//!(PATTERN)}"
,如果我很好地理解 Bash 手册,它只会匹配$PATTERN
排除其余部分的情况$STRING
,但它实际上什么也不输出。那么,我哪里错了?
是否有可能在自己的类实例中让异常自我提升?像这样的东西:
class Error(Exception):
def __init__(self):
if some stuff:
pass
elif some other stuff:
# re-raise myself
raise Error()
Run Code Online (Sandbox Code Playgroud)
我试过使用raise self
但它返回一个错误; 此外,我没有看到任何似乎与此链接的异常类的属性.
编辑
如果我想这样做,那是因为我在我的Exception
类中附加了一些特殊的方法,它根据传递给异常的参数来格式化要打印的错误消息.我本可以在一个单独的对象中完成格式化工作,但因为它只是由异常使用,所以我很自然地将它附加到异常类本身.