小编Uri*_*nta的帖子

Python 泛型缺少交集类型的解决方法?

我遇到了一个可以通过交叉类型轻松解决的问题(目前正在讨论但尚未实施),并且想知道最干净的解决方法是什么。

当前设置和问题

我当前的设置大致对应于以下动物的 ABC 层次结构。有许多动物“特征”(CanFlyCanSwim等)被定义为抽象子类(尽管它们也可以被定义为 mixin)。

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def name(self) -> str: ...  
    
class CanFly(Animal):
    @abstractmethod
    def fly(self) -> None: ...
    
class CanSwim(Animal):
    @abstractmethod
    def swim(self) -> None: ...
Run Code Online (Sandbox Code Playgroud)

以此我定义了特定的动物类别,包括抽象的和具体的:

class Bird(CanFly):
    def fly(self) -> None:
        print("flap wings")
    
class Penguin(Bird, CanSwim):
    def name(self) -> str:
        return "penguin"
    def swim(self) -> None:
        print("paddle flippers")
Run Code Online (Sandbox Code Playgroud)

我还定义了一个通用类来抚摸特定类型的动物:

from typing import Generic, TypeVar

T = TypeVar("T", bound=Animal, contravariant=True)

class Petter(Generic[T], ABC):

    @abstractmethod …
Run Code Online (Sandbox Code Playgroud)

python abc python-3.x mypy python-typing

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

使用boost :: locale/ICU边界分析与中文

使用boost :: locale文档中的示例代码,我无法获得以下内容以正确地标记中文文本:

using namespace boost::locale::boundary;
boost::locale::generator gen;
std::string text="???????";
ssegment_index map(word,text.begin(),text.end(),gen("zh_CN.UTF-8")); 
for(ssegment_index::iterator it=map.begin(),e=map.end();it!=e;++it)
    std::cout <<"\""<< * it << "\", ";
std::cout << std::endl;
Run Code Online (Sandbox Code Playgroud)

这将中华人民共和国分为七个不同的角色中/华/人/民/共/和/国,而不是中华/人民/共和国.在ICU的文档,这增大对编译声称,中国应努力开箱,并使用基于字典的分词器正确分割短语.在上面的代码中使用"ja_JP.UTF-8"语言环境的示例日语测试短语"生きるか死ぬか,それが问题だ." 确实有效,但此标记化不依赖于字典,仅在汉字/假名上边界.

我在这里建议直接在ICU中尝试相同的代码,但结果是一样的.

UnicodeString text = "???????";
UErrorCode status = U_ZERO_ERROR;
BreakIterator* bi = BreakIterator::createWordInstance(Locale::getChinese(), status);
bi->setText(text);
int32_t p = bi->first();
while (p != BreakIterator::DONE) {
    printf("Boundary at position %d\n", p);
    p = bi->next();
}
delete bi;
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?

c++ boost icu boost-locale chinese-locale

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

如何在Python中过滤文本I/O流

给定文本I/O流(例如来自open()StringIO()),如何创建另一个流来过滤掉与特定模式匹配的行,而不首先读取整个输入流?我知道我可以很容易地得到一个可迭代的(line for line in input if filter(line)),但我想要一个可搜索的流.我也理解,即使底层流允许随机访问,搜索也需要读取整个流,但这仍然比读取整个文件更好StringIO("".join(line for line in input if filter(line))).

(作为一个附加组件,如何记住重复搜索的指针将受到欢迎!)

python stream python-3.x python-textprocessing

5
推荐指数
0
解决办法
674
查看次数