考虑以下代码示例
def sum(a: int, b: int):
return a + b
def wrap(*args, **kwargs):
# delegate to sum
return sum(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
除了类型提示丢失之外,代码运行良好。*args, **kwargs在 Python 中用来实现委托模式是很常见的。如果有一种方法可以在使用它们时保留类型提示,那就太好了,但我不知道是否可能以及如何实现。
考虑以下代码示例
class A {
int data
}
class B extends A {}
def o1 = new B(data: 1)
// This works correctly.
def o2 = new A(data:1) {}
// This will throw the following error
// Exception thrown
//
// groovy.lang.GroovyRuntimeException: Could not find matching constructor for: A(LinkedHashMap)
// at ConsoleScript2$1.<init>(ConsoleScript2)
// at ConsoleScript2.run(ConsoleScript2:11)
// at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
// at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
// at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Run Code Online (Sandbox Code Playgroud)
对我来说,匿名类应该与命名类相同。但事实证明,Groovy 对待它们的方式有所不同。我想知道如何解决它。谢谢。
假设我们为回调定义一个类型,如下所示:
CallbackFn = Callable[[str, str, int, int], None]
Run Code Online (Sandbox Code Playgroud)
当我想要实现回调函数并使用外部工具对其进行类型检查时CallbackFn,我必须显式注释类型:
def my_callback(s1: str, s2: str, i1: int, i2: int) -> None:
...
Run Code Online (Sandbox Code Playgroud)
有什么方法可以使用定义的类型提示来CallbackFn注释函数(例如def my_callback(s1,s2,i1,i2) as CallbackFn:)以避免显式注释工作?
给出以下 bash 代码
grep match_nothing file.txt | wc -l
Run Code Online (Sandbox Code Playgroud)
结果0是正确的。但是下面的代码
LINES=$(grep match_nothing file.txt)
wc -l <<< "$LINES"
Run Code Online (Sandbox Code Playgroud)
将返回 1。为什么会发生这种情况以及我该如何纠正。
更新:
这个问题只是grep作为一个例子。让我困惑的是为什么将输出分配给变量会导致不同的结果。