小编exh*_*uma的帖子

如何向动态创建的类添加类型注释?

在一个应用程序中,我有生成动态类的代码,这大大减少了重复代码的数量。但是为 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)

python mypy

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

如何从 typeshed 存根文件导入类型定义?

我有一个函数可以抽象出身份验证逻辑,并且可以基于 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)

python type-hinting

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

突出显示VIM中的特定列

我使用包含固定位置数据的文件进行了大量工作.非分隔的"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)

有任何想法吗?

vim highlighting

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

如何计算子进程发出的每个UDP数据包?

我有一个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上运行,这很可能很重要.但是所有子进程都以同一用户身份运行.

python sockets linux networking

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

用于OAuth身份验证的WSGI中间件

我使用Flask构建了一个非常小的Web应用程序.现在我想为网站添加非常基本的身份验证(我不需要授权).由于Flask不支持auth&auth开箱即用,我想插入一个WSGI中间件来完成这项工作.该网络应用程序仅供大约10人使用,所有这些都在Facebook上.所以我想使用Facebook的OAuth界面.

我已经快速查看了wsgi.org的WSGI中间件列表,并注意到两件事:可用的中间件使用起来非常复杂,或者它已经过时了.

我找到了以下包裹:

  • wsgiauth - 它已经过时了.最后更新是2006年,我找不到任何在线文档
  • authkit - 看起来非常好,但不支持OAuth
  • - 似乎只支持BASIC和基于表单的身份验证.这也有点过时了(最新版本是2008年)
  • webmodules - 仅支持BASIC身份验证

鉴于此列表,我会说AuthKit是最有趣的.唉,它不支持OAuth.我很可能会继续前进并试一试.但是,当我在四处乱逛的时候,我很想知道是否有人周围有更好的解决方案......

python middleware wsgi oauth flask

8
推荐指数
2
解决办法
4176
查看次数

netbeans ide导航器图标的含义?

Netbeans IDE导航器中显示的图标有什么含义?是否在网上发布了某个传奇故事?我在问之前做了谷歌,谢谢.

这是一个截图:

截图

netbeans netbeans-6.9

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

如何使用标准锚标记传递HTTP标头?

根据HTML4引用,没有使用anchor标记传递HTTP头的属性.

我想提供一个使用Accept标头请求特定文件类型的链接.

我能看到的唯一方法就是让它成为,并传递一个GET参数.

你可能为什么我想要这样做...我打算将一堆方法公开为公共API,将结果作为JSON.当使用JavaScript或其他编程语言Accept进行请求时,使用标头来请求特定的响应格式是"正确的方法".但是,这将意味着,我需要适应两个Accept,并GET在我的代码的参数,它闻起来像逻辑的重复.

这个主题在很大程度上是值得商榷的,因为这样的链接可能无法在浏览器中添加书签...仍然...我想知道是否有可能没有太多魔法......

html rest http-headers

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

如何正确地向Mixin类添加类型提示?

请考虑以下示例.这个例子是人为的,但是在一个可运行的例子中说明了这一点:

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重写部分,因为我不是特别喜欢它,并且可能通过重新组织类层次结构来完成相同的操作.

但我仍然想知道这样的事情是如何被恰当地暗示的.

python type-hinting

8
推荐指数
5
解决办法
760
查看次数

Python列表到PostgreSQL数组

我有一个清单:

[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 postgresql

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

如何键入提示函数,其中返回类型取决于参数的输入类型?

假设我有一个将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 type-hinting

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