在一个应用程序中,我有生成动态类的代码,这大大减少了重复代码的数量。但是为 mypy 检查添加类型提示会导致错误。考虑以下示例代码(简化为关注相关位):
class Mapper:
@staticmethod
def action() -> None:
raise NotImplementedError('Not yet implemnented')
def magic(new_name: str) -> type:
cls = type('%sMapper' % new_name.capitalize(), (Mapper,), {})
def action() -> None:
print('Hello')
cls.action = staticmethod(action)
return cls
MyCls = magic('My')
MyCls.action()
Run Code Online (Sandbox Code Playgroud)
使用 mypy 进行检查将导致以下错误:
dynamic_type.py:15: error: "type" has no attribute "action"
dynamic_type.py:21: error: "type" has no attribute "action"
Run Code Online (Sandbox Code Playgroud)
mypy 显然无法判断type调用的返回值是 的子类Mapper,因此它抱怨“type”在我分配给它时没有属性“action”。
请注意,代码功能完美并完成了它应该做的事情,但 mypy 仍然抱怨。
有没有办法标记cls为一种类型Mapper?我试图简单地附加# type: Mapper到创建类的行:
cls = type('%sMapper' % …Run Code Online (Sandbox Code Playgroud) 我有一个函数可以抽象出身份验证逻辑,并且可以基于 SHA 或 MD5。除了哈希实现之外,其余代码是相同的。核心部分如下所示:
def hasher(hash_impl, arg1, arg1):
# do stuff with arg1 and arg2
hash = hash_impl(arg1)
return hash.digest()
from hashlib import md5
hasher(md5, b"foo", b"bar")
Run Code Online (Sandbox Code Playgroud)
我的问题是关于类型提示的。
该实现hashlib使用存根文件进行输入。
如何使用该_Hash对象对上述函数进行类型提示?
from ? import _Hash # <-- How can I access _Hash?
from hashlib import md5, sha
def hasher(hash_impl: _Hash, arg1: bytes, args: bytes) -> bytes:
... as above ...
Run Code Online (Sandbox Code Playgroud) 我使用包含固定位置数据的文件进行了大量工作.非分隔的"CSV"文件,如果你愿意......通常,我想强调一个特定的专栏.
我试过了
:match ErrorMsg /\%>30v.\+\%<40v/
Run Code Online (Sandbox Code Playgroud)
但这种运行速度非常慢,只与第一行匹配.我想这个文件可能太大了.请注意,文件非常宽(大约40000个字符)但不是很长(大约2000行).数据源自我无法控制的旧工具.
示例文件:
63082
01089
75518 735301
53473 017146
37217
07
940376
762 2842
88331
40680 8928
645718
0131
03522
47210 27431
93837
8825072 49479415
52084 8940
0591705 205635
525429
65339 300
0397
1983
0
2605768
121991 648
3892
1260
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有一个Python应用程序,它协调对底层进程的调用.使用这些进程调用subprocess.check_output它们,并对远程网络设备进行SNMP调用.
对于性能监视,我想计算发送的SNMP数据包的数量.我主要对数据包的数量感兴趣.请求/响应的数据包大小也很有趣,但不太重要.目的是了解此应用程序导致的防火墙压力.
因此,为了论证,让我们假设以下愚蠢的应用程序:
from subprocess import check_output
output = check_output(['snmpget', '-v2c', '-c', 'private', '192.168.1.1', '1.3.6.1.2.1.1.2.0'])
print(output)
Run Code Online (Sandbox Code Playgroud)
这将导致在端口161上发送新的UDP数据包.
在这种情况下我怎么算他们?
这是带有存根函数的另一个版本(也可以是上下文管理器):
from subprocess import check_call
def start_monitoring():
pass
def stop_monitoring():
return 0
start_monitoring()
check_call(['snmpget', '-v2c', '-c', 'private', '192.168.1.1', '1.3.6.1.2.1.1.2.0'])
check_call(['snmpget', '-v2c', '-c', 'private', '192.168.1.1', '1.3.6.1.2.1.1.2.0'])
check_call(['snmpget', '-v2c', '-c', 'private', '192.168.1.1', '1.3.6.1.2.1.1.2.0'])
num_connections = stop_monitoring()
assert num_connections == 3
Run Code Online (Sandbox Code Playgroud)
在这个人为的例子中,当我手动执行SNMP调用时,显然会有3个调用.但在实际示例中,SNMP调用的数量不等于对子进程的调用.有时一个或多个GET被执行,有时它是简单的步行(即,许多连续的UDP请求),有时它是批量遍历(未知数量的请求).
所以我不能简单地监视调用应用程序的次数.我真的要监视UDP请求.
这样的事情甚至可能吗?如果有,怎么样?
知道这可以作为非root用户在Linux上运行,这很可能很重要.但是所有子进程都以同一用户身份运行.
我使用Flask构建了一个非常小的Web应用程序.现在我想为网站添加非常基本的身份验证(我不需要授权).由于Flask不支持auth&auth开箱即用,我想插入一个WSGI中间件来完成这项工作.该网络应用程序仅供大约10人使用,所有这些都在Facebook上.所以我想使用Facebook的OAuth界面.
我已经快速查看了wsgi.org的WSGI中间件列表,并注意到两件事:可用的中间件使用起来非常复杂,或者它已经过时了.
我找到了以下包裹:
BASIC和基于表单的身份验证.这也有点过时了(最新版本是2008年)BASIC身份验证鉴于此列表,我会说AuthKit是最有趣的.唉,它不支持OAuth.我很可能会继续前进并试一试.但是,当我在四处乱逛的时候,我很想知道是否有人周围有更好的解决方案......
Netbeans IDE导航器中显示的图标有什么含义?是否在网上发布了某个传奇故事?我在问之前做了谷歌,谢谢.
这是一个截图:

根据HTML4引用,没有使用anchor标记传递HTTP头的属性.
我想提供一个使用Accept标头请求特定文件类型的链接.
我能看到的唯一方法就是让它成为,并传递一个GET参数.
你可能为什么我想要这样做...我打算将一堆方法公开为公共API,将结果作为JSON.当使用JavaScript或其他编程语言Accept进行请求时,使用标头来请求特定的响应格式是"正确的方法".但是,这将意味着,我需要适应两个Accept头,并在GET在我的代码的参数,它闻起来像逻辑的重复.
这个主题在很大程度上是值得商榷的,因为这样的链接可能无法在浏览器中添加书签...仍然...我想知道是否有可能没有太多魔法......
请考虑以下示例.这个例子是人为的,但是在一个可运行的例子中说明了这一点:
class MultiplicatorMixin:
def multiply(self, m: int) -> int:
return self.value * m
class AdditionMixin:
def add(self, b: int) -> int:
return self.value + b
class MyClass(MultiplicatorMixin, AdditionMixin):
def __init__(self, value: int) -> None:
self.value = value
instance = MyClass(10)
print(instance.add(2))
print(instance.multiply(2))
Run Code Online (Sandbox Code Playgroud)
执行时,这将给出以下输出:
12
20
Run Code Online (Sandbox Code Playgroud)
代码有效.
但运行mypy它会产生以下错误:
example.py:4: error: "MultiplicatorMixin" has no attribute "value"
example.py:10: error: "AdditionMixin" has no attribute "value"
Run Code Online (Sandbox Code Playgroud)
我理解为什么mypy给出了这个结果.但mixin类本身从不使用.它们总是用作额外的超类.
对于上下文,这是一个已在现有应用程序中使用的模式,我正在添加类型提示.在这种情况下,错误是误报.我正在考虑使用mixins重写部分,因为我不是特别喜欢它,并且可能通过重新组织类层次结构来完成相同的操作.
但我仍然想知道这样的事情是如何被恰当地暗示的.
我有一个清单:
[u'ABC', u'DEF', u'GHI']
Run Code Online (Sandbox Code Playgroud)
我必须将它插入到postgresql数组中:( ALTER TABLE "aTable" ADD COLUMN "Test" text[];)
将数据添加到postgresql的语法是:
update "aTable" SET "Test" = '{"ABC", "DEF", "GHI"}'
Run Code Online (Sandbox Code Playgroud)
如何将列表转换为正确的格式?
假设我有一个将Python数据类型转换为Postgres数据类型的函数,如下所示:
def map_type(input):
if isinstance(input, int):
return MyEnum(input)
elif isinstance(input, str):
return MyCustomClass(str)
Run Code Online (Sandbox Code Playgroud)
我可以输入提示:
def map_type(input: Union[int, str]) -> Union[MyEnum, MyCustomClass]: ...
Run Code Online (Sandbox Code Playgroud)
但是,即使它是正确的,下面的代码也无法进行类型检查:
myvar = map_type('foobar')
print(myvar.property_of_my_custom_class)
Run Code Online (Sandbox Code Playgroud)
完整示例(工作代码,但类型提示中的错误):
from typing import Union
from enum import Enum
class MyEnum(Enum):
VALUE_1 = 1
VALUE_2 = 2
class MyCustomClass:
def __init__(self, value: str) -> None:
self.value = value
@property
def myproperty(self) -> str:
return 2 * self.value
def map_type(value: Union[int, str]) -> Union[MyEnum, MyCustomClass]:
if isinstance(value, int):
return MyEnum(value)
elif isinstance(value, str):
return …Run Code Online (Sandbox Code Playgroud) python ×7
type-hinting ×3
flask ×1
highlighting ×1
html ×1
http-headers ×1
linux ×1
middleware ×1
mypy ×1
netbeans ×1
netbeans-6.9 ×1
networking ×1
oauth ×1
postgresql ×1
rest ×1
sockets ×1
vim ×1
wsgi ×1