在Python中,Python有Union个类型,当一个方法可以接受多种类型时,这很方便:

from typing import Union

def test(x: Union[str,int,float,]):
    print(x)

if __name__ == '__main__':
    test(1)
    test('str')
    test(3.1415926)

Raku可能没有Python那样的联合类型,但where子句可以实现类似的效果:

sub test(\x where * ~~ Int | Str | Rat) {
    say(x)
}

sub MAIN() {
    test(1);
    test('str');
    test(3.1415926);
}

我想知道Raku是否有可能提供Python的联合类型?

#        vvvvvvvvvvvvvvvvvvvv - the Union type doesn't exist in Raku now.
sub test(Union[Int, Str, Rat] \x) {
    say(x)
}

推荐答案

我的答案(与您的第一个解决方案非常相似;)将是:

subset Union where Int | Rat | Str;

sub test(Union \x) {
   say(x) 
}

sub MAIN() {
    test(1);
    test('str');
    test(pi);
}

Constraint type check failed in binding to parameter 'x'; 
expected Union but got Num (3.141592653589793e0)

(或者你也可以在通话签名中加入where条款,就像你所拥有的那样)

与Python不同:

  • 这是raku的原生版本,不需要像"打字"这样的软件包来导入
  • Python Union/SumTypes用于静态暗示,这对IDE等有好处
  • but这些类型在Python中是非强制的(根据@freshpaste注释和这SO),在raku中它们会被判断并在运行时失败

所以-raku语法是用来满足你的要求的...当然,这是一种不同的语言,所以它用不同的方式.

我个人认为,如果违反类型判断,类型化语言应该失败.在我看来,并非总是强制执行的类型暗示是一种虚假的安慰.

从更广泛的Angular 来看,raku还为IntStr、RatStr、NumStr和ComplexStr提供内置的Allomorph种类型,因此您可以在混合模式下使用字符串和数学函数

Python相关问答推荐

查找下一个值=实际值加上使用极点的50%

从管道将Python应用程序部署到Azure Web应用程序,不包括需求包

如何计算列表列行之间的公共元素

多处理代码在while循环中不工作

仿制药的类型铸造

当使用keras.utils.Image_dataset_from_directory仅加载测试数据集时,结果不同

对整个 pyramid 进行分组与对 pyramid 列子集进行分组

如何在虚拟Python环境中运行Python程序?

两个pandas的平均值按元素的结果串接元素.为什么?

如何在给定的条件下使numpy数组的计算速度最快?

pyscript中的压痕问题

导入...从...混乱

如何在UserSerializer中添加显式字段?

如何保持服务器发送的事件连接活动?

为什么'if x is None:pass'比'x is None'单独使用更快?

如何获取Python synsets列表的第一个内容?

使用类型提示进行类型转换

提取数组每行的非零元素

Pandas在rame中在组内洗牌行,保持相对组的顺序不变,

你能把函数的返回类型用作其他地方的类型吗?'