小编Kar*_*nna的帖子

Mypy 在类型分支时错误地报告联合类型变量的错误

我在使用 mypy 时遇到了问题,并且能够找到有关它的任何帮助/报告。以下简化代码和错误消息应该是不言自明的:

#!/usr/bin/env python3

from typing import List, Union

class Corpus:
  path: List[str]

  def __init__(self, path:Union[str,List[str]]) -> None:
    if type(path) == str:
      self.path = [path]
    else:
      self.path = path
Run Code Online (Sandbox Code Playgroud)

Mypy 给出以下错误:

simplified.py:10: error: List item 0 has incompatible type "Union[str, List[str]]"; expected "str"
simplified.py:12: error: Incompatible types in assignment (expression has type "Union[str, List[str]]", variable has type "List[str]")
Run Code Online (Sandbox Code Playgroud)

尽管检查了路径变量的类型,以便 self.path 应始终生成字符串列表,但 mypy 仍会抱怨类型不兼容。

我是否忽略了某些事情或者这是 mypy 中的错误?(如果这是一个错误,我应该使用#type: ignore注释还是有更好的解决方法?)

(一些背景:我决定通过编写一个模块来简化我的生活,该模块将处理一些重复的工作。有问题的参数应该是文本数据的路径,我希望它在大多数情况下只是一个字符串,所以我不不想强制将其放入列表中。但是,我也希望允许指定更多路径。在内部,我无论如何都将其存储为列表,因为类上的迭代器始终使用此类列表进行初始化(然后可能通过以下方式进一步扩展它) “解压”目录))。

python-3.x mypy

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

Perl:没有足够的函数参数

我是Perl的新手,目前正在尝试理解提到的错误消息.

我有这段代码(仍主要用于测试pourposes)

#!/usr/bin/perl

use strict;
use warnings;

my %info = (autor => "Karryanna", jazyk => "cs");

vec([%info]);

sub vec
{
  my ($hashref) = @_;
  print $hashref->autor . "\n";
}
Run Code Online (Sandbox Code Playgroud)

当我尝试运行它时,它会给出此错误消息

Not enough arguments for vec at test.pl line 8, near "])"
Run Code Online (Sandbox Code Playgroud)

当我试图google它时,我发现这个网站让我觉得在使用&符号的子程序调用之前就足够了.我试了一下它确实有所帮助.

然而,当我后来遇到另一个问题时,谷歌搜索带我去了这个问题.重点是答案说明

你应该调用没有&的子程序,例如populate(...),除非你特别想要覆盖sub的原型.如果您不知道原型是什么,请不要使用&.

我完全不知道Perl上下文中的原型是什么.那么 - 现实是什么样的?我应该使用&或者还有其他可能更"干净"的解决方案吗?

谢谢!

(顺便说一下,如果我可能会问一些OT问题 - 我应该在调用之后真正定义子程序吗?对我来说这似乎很不自然,但是,我已经发现恢复顺序会让编译器抱怨)

perl

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

标签 统计

mypy ×1

perl ×1

python-3.x ×1