小编mic*_*yer的帖子

规范化Unicode

在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 unicode python-3.x

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

在Python中,"<>"是什么意思?

我正在尝试在Python 3.3中使用一个旧库(可追溯到2003年!).当我导入它时,Python会抛出一个错误,因为<>源文件中有迹象,例如:

if (cnum < 1000 and nnum <> 1000 and ntext[-1] <> "s":
    ...
Run Code Online (Sandbox Code Playgroud)

我想这是一个现在被遗弃的语言标志.

究竟是什么意思,我应该用哪个(更近期的)标志替换它?

python syntax operators python-2.x

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

泛型表达式中的副作用

我正在使用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和 …

c generics c11

25
推荐指数
1
解决办法
611
查看次数

当子进程引发CalledProcessError异常时,检查命令的返回码

我想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)

python subprocess python-3.x

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

如果在使用read时未使用新行char(\n)终止,则尊重最后一行

我注意到有一段时间,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处理尚未由我自己创建或修改的文件时,如何处理这种情况,以及我不知道它们是否真的以"换行符"结尾?

bash shell built-in

8
推荐指数
1
解决办法
6916
查看次数

从字符串中删除有序的字符序列

我最近意识到strip的Python(和它的孩子们的内置rstriplstrip)不治疗是给予它作为参数作为一个字符的有序序列串,而是作为一种字符的"蓄水池"的:

>>> s = 'abcfooabc'
>>> s.strip('abc')
'foo'
>>> s.strip('cba')
'foo'
>>> s.strip('acb')
'foo'
Run Code Online (Sandbox Code Playgroud)

等等.

有没有办法从给定的字符串中删除有序子字符串,以便在上面的示例中输出会有所不同?

python strip python-3.x

8
推荐指数
3
解决办法
6224
查看次数

分配几个相同类型的数组

我需要分配几个相同类型和形状的数组.一开始,我做了类似的事情:

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)

c arrays malloc

8
推荐指数
1
解决办法
83
查看次数

NFC 标准化边界是否也扩展了字素簇边界?

这个问题与文本编辑有关。假设您有一段标准化形式的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)

unicode unicode-normalization

7
推荐指数
1
解决办法
81
查看次数

作业规则

我注意到了一个(看似)奇怪的分配行为,这让我多次犯了编程错误.

首先参见以下示例:

>>> 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在递增时才显式引用.

我有两个问题:

  1. 为什么会这样?
  2. 我应该注意哪些特殊规则吗?

python python-3.x

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

仅在API中公开void指针

我已经看到很多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用户无法访问对象的内部,仅仅在主库头中公开类型名称并隐藏底层结构的详细信息(或者其他任何内容)是不够的.实际文件中的实际对象?

c api void

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

文件已关闭吗?

我经常看到这种代码:

filecontent = open(thefilename).read()
Run Code Online (Sandbox Code Playgroud)

我想知道open在这种情况下创建的文件对象是什么:它是隐式关闭的,还是在某个地方保持打开状态?

python file python-3.x

4
推荐指数
1
解决办法
998
查看次数

计算字符串中某个模式出现的次数(仅限 bash 内置函数)

我有一个看起来像这样的字符串:

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,但它实际上什么也不输出。那么,我哪里错了?

bash built-in

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

让异常提升自己

是否有可能在自己的类实例中让异常自我提升?像这样的东西:

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类中附加了一些特殊的方法,它根据传递给异常的参数来格式化要打印的错误消息.我本可以在一个单独的对象中完成格式化工作,但因为它只是由异常使用,所以我很自然地将它附加到异常类本身.

python exception python-3.x

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