假设我想在Python中编写一个接受任何类型数字的函数,我可以将其注释如下:
from numbers import Number
def foo(bar: Number):
print(bar)
Run Code Online (Sandbox Code Playgroud)
将这个概念更进一步,我正在编写接受数字类型(即或int
dtypes )作为参数的函数。目前,我正在写:float
numpy
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)
事实证明(或者至少据我所知),NumberType
Python (3.9) 中不存在泛型这样的东西:
>>> type(Number)
abc.ABCMeta
Run Code Online (Sandbox Code Playgroud)
是否有一种干净的方法(即没有运行时检查)来实现所需的注释类型?
我在几个项目中使用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.Union
fromdatatypes
以便最终在函数中使用。我期望解包语法能够工作:
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)
我怎样才能实现我想要的目标?
作为Linux 3中用Python 3 [.4-.6] 编写的测试套件的一部分,我必须运行一些第三方测试.第三方测试是bash脚本.它们旨在与Perl的prove
TAP线束一起运行.一个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) 我正在尝试展开一些嵌套循环,以(可能)更好的性能而牺牲内存.在我的场景中,我最终得到一个大约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时间的合理范围内,我还有哪些其他选项可能只产生一次列表的每个元素?
目前,我正在检查具有多个(例如三个)任意但相同类型的元组,其形式如下:
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 的运行时检查进行测试,并在生产中完全停用它们。
以下问题
并且他们各自的答案让我想到我如何能够有效地解析一个(或多或少可信的)用户给出的单个数学表达式(一般来说,就这个答案而言)/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软件包,我用以下方式将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.py
与subprocess.Popen
等当前方法的缺点:
什么是规范(如果有的话)或只是一个理智的,可能跨平台的方法来定义Python包的node.js依赖关系,使其可以发布?
为什么这个问题甚至相关?JavaScript不仅仅适用于Web开发(更多).还有一些有趣的(相关的)数据处理工具.如果你不想错过/忽略它们,那么,欢迎来到这种特殊形式的地狱.
我最近遇到了冷静,这似乎是我正在寻找的.我还没有尝试过它,它似乎也是一个相对年轻的项目.
我在那里问了一个类似的问题.
编辑(1):有趣的资源:JavaScript与研究计算 - 对于那些遗憾的必要的人的简要指南
我定义一个类如下:
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)
这对我来说没有意义.如何使用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
基于此问题及其答案:在 Travis CI 上阻止测试或进程的网络访问的适用方法是什么(如果有的话)?
背景:我想测试离线功能,即缓存,从而能够在没有互联网/网络访问的情况下使用库。该过程中涉及的依赖项(第三方软件)尝试连接到 Internet/网络。目前,我正在设法禁止其互联网/网络访问(通过“拔掉插头”在本地确认),但我想找到一种方法来实施适当的 CI 测试以进行长期维护。大多数测试基础设施都是用 Python 编写的,并基于 pytest。
python ×10
type-hinting ×4
cython ×1
dictionary ×1
eval ×1
generator ×1
javascript ×1
linux ×1
node.js ×1
npm ×1
numexpr ×1
perl ×1
perl-prove ×1
pip ×1
pytest ×1
python-3.x ×1
random ×1
setup.py ×1
sympy ×1
tap ×1
travis-ci ×1
tuples ×1
types ×1