我想就最pythonic的方式获得您的建议,以使用类型提示在python中表达以下函数:
我想公开一个函数作为接受输入参数并返回输出的库的一部分。输入参数的契约应该是:
一个例子可能是一个函数,它接受一系列 URL,然后向这些 URL 发出请求,可能带有一些重试逻辑,所以我必须不止一次迭代原始序列。但我的问题不仅仅是这个样本。
乍一看,合适的签名是:
from typing import Iterable
def do_sth(input: Iterable[str]) -> SomeResult:
...
Run Code Online (Sandbox Code Playgroud)
然而,这违反了第三个要求,因为在 python 中不能保证您可以多次迭代一个 Iterable,例如因为迭代器和生成器本身就是可迭代的。
另一种尝试可能是:
from typing import Sequence
def do_sth(input: Sequence[str]) -> SomeResult:
...
Run Code Online (Sandbox Code Playgroud)
但是Sequence合同超出了我的功能要求,因为它包括索引访问和长度知识。
我想到的一个解决方案是使用Iterable签名,然后在内部制作输入的副本。但是如果源序列很大,这似乎会引入潜在的内存问题。
有没有解决方案,即python是否知道Iterable每次都会返回一个新迭代器的概念?
在我的场景中,HTML5 页面(父页面)包含来自不同域的 iframe(子页面)。理想情况下,我希望能够将元素从父级拖到子级中。
这在 FireFox 中有效,但由于安全限制而在 Chrome 中失败(afaik https://bugs.chromium.org/p/chromium/issues/detail?id=251718)。
但是,如果我在不同的浏览器实例中打开相同的 HTML5 页面,从那里拖动到另一个实例的 iframe 中,则这是允许的。
安全限制的原因是用户看不到目标 iframe 的 URL,但这两种情况都是如此。为什么其中一种有效,而另一种则无效?
示例位于 http://carsten-leue.de/iframe/cross-domain/
尝试drag me拖入drop here. 这在 Chrome 中是不可能的。在另一个浏览器窗口中打开相同的 URL,然后drag me从新窗口拖到drop here旧窗口中。这有效。
我想在通过 WebPack 捆绑的 TypeScript 应用程序中对 rxjs 进行 Treeshake:
rxjs@7.5.7 webpack@5.74.0
根据https://rxjs.dev/guide/installation我必须使用ES2015的导出rxjs,但我不知道如何做到这一点。
您知道示例或某些文档的链接吗?
我当前的 webpack 配置是:
const path = require('path');
module.exports = {
entry: './src/index.ts',
devtool: 'source-map',
target: 'node16',
mode: 'production',
module: {
rules: [
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/,
},
],
},
resolve: {
extensions: ['.tsx', '.ts', '.js'],
},
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
};
Run Code Online (Sandbox Code Playgroud)
此配置已成功对rxjs@6版本进行树摇动(具有module入口点),但无法对树摇动rxjs@7并使用完整的 CJS 版本。
感谢您的指点!
在 golang 1.18 中我想定义一个如下函数:
func Pipe[A, T1, T2 any](left func(A) T1, right func(T1) T2) func(A) T2 {
return func(a A) T2 {
return right(left(a))
}
}
Run Code Online (Sandbox Code Playgroud)
例如,函数的输出left应该是函数的输入right,表示为泛型。
我注意到,对于以下示例,这无法按预期工作:
func OpenFile(name string) *os.File {
...
}
func ReadAll(rdr io.Reader) []byte {
...
}
var OpenRead = Pipe(OpenFile, ReadAll)
Run Code Online (Sandbox Code Playgroud)
这无法编译,因为编译器认为虽然兼容但T1并不相同。*os.Fileio.Reader
如果我要在没有模板的情况下调用链,如下所示:
var result = ReadAll(OpenFile("test"))
Run Code Online (Sandbox Code Playgroud)
然后编译器识别兼容类型。
问题:
Pipe以允许所需的行为?api-design ×1
covariance ×1
generics ×1
go ×1
html ×1
node.js ×1
python ×1
rxjs ×1
security ×1
tree-shaking ×1
type-hinting ×1
webpack ×1