小编Car*_*ten的帖子

表示可以多次迭代的 Iterable 的 Pythonic 方式是什么

我想就最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每次都会返回一个新迭代器的概念?

python api-design type-hinting

8
推荐指数
1
解决办法
193
查看次数

Chrome 跨框架拖放:为什么它可以跨浏览器工作?

在我的场景中,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旧窗口中。这有效。

html security drag-and-drop google-chrome

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

使用 RxJS 7.x 和 WebPack 5 进行 TreeShaking

我想在通过 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 版本。

感谢您的指点!

node.js rxjs webpack tree-shaking

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

golang 1.18 中逆变类型如何与泛型一起工作?

在 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)

然后编译器识别兼容类型。

问题:

  • golang 1.18 泛型中有没有办法修复 的签名Pipe以允许所需的行为?
  • 这是 golang 1.18 的设计行为还是一个错误?

generics covariance contravariance go

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