小编s-m*_*m-e的帖子

如何暗示数字*类型*(即数字的子类) - 而不是数字本身?

假设我想在Python中编写一个接受任何类型数字的函数,我可以将其注释如下:

from numbers import Number

def foo(bar: Number):
    print(bar)
Run Code Online (Sandbox Code Playgroud)

将这个概念更进一步,我正在编写接受数字类型(即或intdtypes )作为参数的函数。目前,我正在写:floatnumpy

from typing import Type

def foo(bar: Type):
    assert issubclass(bar, Number)
    print(bar)
Run Code Online (Sandbox Code Playgroud)

我想我可以Type用类似的东西代替NumberType(类似于NotImplementedType和朋友,在Python 3.10中重新引入),因为所有数字类型都是以下的子类Number

from numbers import Number
import numpy as np

assert issubclass(int, Number)
assert issubclass(np.uint8, Number)
Run Code Online (Sandbox Code Playgroud)

事实证明(或者至少据我所知),NumberTypePython (3.9) 中不存在泛型这样的东西:

>>> type(Number)
abc.ABCMeta
Run Code Online (Sandbox Code Playgroud)

是否有一种干净的方法(即没有运行时检查)来实现所需的注释类型?

python type-hinting python-typing

29
推荐指数
1
解决办法
5435
查看次数

如何动态定义“typing.Union”?

我在几个项目中使用Typeguard在 Python 运行时进行类型检查。它运作得很好。

我遇到过一种情况,函数参数的类型是typing.Union由一些动态收集的数据类型组成的。例如

def find_datatypes():
    # some stuff ...
    return (str, int) # dynamically generated list / tuple

datatypes = find_datatypes()
Run Code Online (Sandbox Code Playgroud)

现在我想生成一个typing.Unionfromdatatypes以便最终在函数中使用。我期望解包语法能够工作:

my_union = typing.Union[*datatypes]

@typeguard.typechecked
def some_function(param: my_union):
    pass
Run Code Online (Sandbox Code Playgroud)

然而,它并没有:

    my_union = typing.Union[*datatypes]
                            ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现我想要的目标?

python type-hinting dynamic-typing python-typing

20
推荐指数
2
解决办法
5033
查看次数

如何在无缓冲模式下运行Perl的``prove`` TAP线束?

作为Linux 3中用Python 3 [.4-.6] 编写的测试套件的一部分,我必须运行一些第三方测试.第三方测试是bash脚本.它们旨在与Perl的proveTAP线束一起运行.一个bash脚本最多可以包含几千个单独的测试 - 其中一些可以无限期挂起.超时后,我想杀死测试脚本并收集有关它被卡住的地方的一些信息.

因为bash脚本创建了自己的进程,所以我尝试将整个prove进程树隔离到一个新的进程组中,因此如果出现问题,我最终可能会整个进程组被杀死.因为测试必须以root权限运行,所以我用它sudo -b来创建具有root权限的新进程组.这个策略(而不setsid是以某种方式使用)是我在SE Unix和Linux上收到的关于这个问题的评论的结果.

问题是,prove如果我sudo -b通过Python 启动"过早地"杀死它,我会从TAP线束中丢失所有输出subprocess.Popen.

我把它分成了一个简单的测试用例.以下是一个名为的bash测试脚本job.t:

#!/bin/bash

MAXCOUNT=20
echo "1..$MAXCOUNT"
for (( i=1; i<=$MAXCOUNT; i++ ))
do
   echo "ok $i"
   sleep 1
done
Run Code Online (Sandbox Code Playgroud)

仅仅为了比较,我还写了一个Python脚本,命名job.py产生或多或少相同的输出并表现出相同的行为:

import sys
import time
if __name__ == '__main__':
    maxcount = 20
    print('1..%d' % maxcount)
    for i in range(1, maxcount + 1):
        sys.stdout.write('ok %d\n' …
Run Code Online (Sandbox Code Playgroud)

python linux perl tap perl-prove

10
推荐指数
1
解决办法
284
查看次数

以(伪)随机顺序从大列表中有效地产生元素

我正在尝试展开一些嵌套循环,以(可能)更好的性能而牺牲内存.在我的场景中,我最终得到一个大约300M元素(元组)的列表,我必须以(或多或少)随机顺序产生.

在这个数量级上,random.shuffle(some_list)真的不再是那种方式了.

以下示例说明了该问题.请注意,在x86_64 Linux和CPython 3.6.4上,它将占用大约11 GB的内存.

def get_random_element():
    some_long_list = list(range(0, 300000000))
    for random_item in some_long_list:
        yield random_item
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的想法是简单地在每次迭代中生成一个随机索引,并从列表中无限地生成随机选取的元素(无限期).它可能会多次产生某些元素并完全跳过其他元素,这将是一个值得考虑的权衡.

在内存和CPU时间的合理范围内,我还有哪些其他选项可能只产生一次列表的每个元素?

python random generator python-3.x

10
推荐指数
1
解决办法
344
查看次数

具有多个任意但类型相同的元组

目前,我正在检查具有多个(例如三个)任意但相同类型的元组,其形式如下:

from typing import Tuple, Union

Union[Tuple[int, int, int], Tuple[float, float, float]]
Run Code Online (Sandbox Code Playgroud)

我想让这个检查更通用,也允许numpy数字类型。即我尝试使用numbers.Number

from numbers import Number
from typing import Tuple

Tuple[Number, Number, Number]
Run Code Online (Sandbox Code Playgroud)

上面的片段还允许混合类型的元组,只要一切都是数字。

我想将元组限制为相同类型的数字。

如何才能实现这一目标?


从技术上讲,这个问题适用于 Python 和类型提示规范本身。然而,正如评论中指出的,它的处理是特定于实现的,即 MyPy 不会捕获每个边缘情况和/或不一致。就我个人而言,我使用带有typeguard 的运行时检查进行测试,并在生产中完全停用它们。

python types tuples type-hinting python-typing

10
推荐指数
1
解决办法
1893
查看次数

快速评估大量输入值的数学表达式(函数)

以下问题

并且他们各自的答案让我想到我如何能够有效地解析一个(或多或少可信的)用户给出的单个数学表达式(一般来说,就这个答案而言)/sf/answers/41600611/来自数据库的20k到30k输入值.我实施了快速而肮脏的基准测试,因此我可以比较不同的解

# Runs with Python 3(.4)
import pprint
import time

# This is what I have
userinput_function = '5*(1-(x*0.1))' # String - numbers should be handled as floats
demo_len = 20000 # Parameter for benchmark (20k to 30k in real life)
print_results = False

# Some database, represented by an array of dicts (simplified for this example)

database_xy = []
for a in range(1, demo_len, 1):
    database_xy.append({
        'x':float(a),
        'y_eval':0,
        'y_sympya':0,
        'y_sympyb':0,
        'y_sympyc':0,
        'y_aevala':0, …
Run Code Online (Sandbox Code Playgroud)

python eval abstract-syntax-tree sympy numexpr

9
推荐指数
1
解决办法
2902
查看次数

有哪些选项可用于定义具有node.js依赖关系的Python包?

目前,我在本地使用了一些(未发布的)Python软件包,我用以下方式将Linux上的Bash脚本安装(用于开发)到一个激活的(否则为"空")虚拟环境中:

cd /root/of/python/package
pip install -r requirements_python.txt # includes "nodeenv"
nodeenv -p # pulls node.js and integrates it into my virtual environment
npm i -g npm # update npm ...
cat requirements_node.txt | xargs npm install -g
pip install -e .
Run Code Online (Sandbox Code Playgroud)

背景是我有许多node.js依赖项,JavaScript CLI脚本,我的Python代码调用它们.

当前方法的优点:

  • 死简单:依赖于nodeenv所有必需的管道
  • 理论上可以内实现setup.pysubprocess.Popen

当前方法的缺点:

  • 类似Unix的平台只有Bash
  • "很难"分发我的包,比​​如说PyPI
  • 需要一个虚拟环境
  • 如果全局安装包,则可能产生"有趣"的副作用
  • 可能会干扰当前虚拟环境中nodeenv的预先存在的配置/"部署"

什么是规范(如果有的话)或只是一个理智的,可能跨平台的方法来定义Python包的node.js依赖关系,使其可以发布?

为什么这个问题甚至相关?JavaScript不仅仅适用于Web开发(更多).还有一些有趣的(相关的)数据处理工具.如果你不想错过/忽略它们,那么,欢迎来到这种特殊形式的地狱.


我最近遇到了冷静,这似乎是我正在寻找的.我还没有尝试过它,它似乎也是一个相对年轻的项目.

我在那里问了一个类似的问题.


编辑(1):有趣的资源:JavaScript与研究计算 - 对于那些遗憾的必要的人的简要指南


编辑(2):我针对nodeenv启动了一个问题,询问我如何使项目依赖于它.

javascript python node.js npm python-packaging

9
推荐指数
2
解决办法
853
查看次数

如何对字典(在运行时)进行类型提示/类型检查以查找任意数量的任意键/值对?

我定义一个类如下:

from numbers import Number
from typing import Dict

from typeguard import typechecked

Data = Dict[str, Number]

@typechecked
class Foo:
    def __init__(self, data: Data):
        self._data = dict(data)
    @property
    def data(self) -> Data:
        return self._data
Run Code Online (Sandbox Code Playgroud)

我在用typeguard。我的目的是限制可以进入数据字典的类型。显然,typeguard如果将整个字典传递给函数或从函数返回,则会检查整个字典。如果字典直接“暴露”,那么检查类型就成为字典的“责任”——这显然是行不通的:

bar = Foo({'x': 2, 'y': 3}) # ok

bar = Foo({'x': 2, 'y': 3, 'z': 'not allowed'}) # error as expected

bar.data['z'] = 'should also be not allowed but still is ...' # no error, but should cause one
Run Code Online (Sandbox Code Playgroud)

PEP 589 …

python dictionary type-hinting python-typing

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

在涉及Cython的setup.py中,如果是install_requires,那么如何从库中导入一些东西呢?

这对我来说没有意义.如何使用setup.py安装Cython,然后使用setup.py编译库代理?

import sys, imp, os, glob
from setuptools import setup
from Cython.Build import cythonize # this isn't installed yet

setup(
    name='mylib',
    version='1.0',
    package_dir={'mylib': 'mylib', 'mylib.tests': 'tests'},
    packages=['mylib', 'mylib.tests'],
    ext_modules = cythonize("mylib_proxy.pyx"), #how can we call cythonize here?
    install_requires=['cython'],
    test_suite='tests',
)
Run Code Online (Sandbox Code Playgroud)

后来:python setup.py构建

Traceback (most recent call last):
  File "setup.py", line 3, in <module>
    from Cython.Build import cythonize
ImportError: No module named Cython.Build
Run Code Online (Sandbox Code Playgroud)

这是因为尚未安装cython.

奇怪的是,很多项目都是用这种方式编写的.一个快速的github搜索显示:https://github.com/search? utf8 =% E2%9C%93&q = install_requires + cython&type = Code

python pip cython setup.py

7
推荐指数
2
解决办法
663
查看次数

在 Travis 上阻止测试/进程的网络访问?

基于此问题及其答案:在 Travis CI 上阻止测试或进程的网络访问的适用方法是什么(如果有的话)?


背景:我想测试离线功能,即缓存,从而能够在没有互联网/网络访问的情况下使用库。该过程中涉及的依赖项(第三方软件)尝试连接到 Internet/网络。目前,我正在设法禁止其互联网/网络访问(通过“拔掉插头”在本地确认),但我想找到一种方法来实施适当的 CI 测试以进行长期维护。大多数测试基础设施都是用 Python 编写的,并基于 pytest。

python pytest travis-ci

7
推荐指数
1
解决办法
309
查看次数