小编Dur*_*ndA的帖子

如何将 Python 模块打包成默认的 extras?

我的 Python 包有可选功能 ( extras_require),我希望默认选择它们。

更具体地说,我希望其pip install mypackage行为类似于pip install mypackage[extra]并且我可以安装带有类似pip install mypackage[core].

setup(
    name="mypackage",
    ...
    extras_require={
        "extra":  ["extra1>=1.2", "extra2"],
        "core": [],
    }
)
Run Code Online (Sandbox Code Playgroud)

是否可以通过类似于上面的设置脚本来实现此目的?

python packaging pip setuptools pypi

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

GitHub API OpenPGP密钥格式

GitHub REST API v3为GPG密钥public_key返回的字段格式是什么?

例如,该命令curl -v -H "Accept: application/vnd.github.cryptographer-preview" https://api.github.com/users/DurandA/gpg_keys返回以下键:

pub   dsa2048/403094DF 2017-09-03 [SC] [expires: 2018-09-03]
uid         [ultimate] Arnaud Durand <arnaud.durand@unifr.ch>
sub   elg2048/A454F414 2017-09-03 [E] [expires: 2018-09-03]
Run Code Online (Sandbox Code Playgroud)

根据API文档:

public_key响应字段中返回的数据不是GPG格式的密钥.当用户上载GPG密钥时,将对其进行解析,并提取并存储加密公钥.此加密密钥是此页面上的API返回的密钥.此密钥不适合由GPG等程序直接使用.

是否可以从CLI或以编程方式使用这些密钥?

github pgp openpgp github-api

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

异步迭代器以固定间隔滴答

我正在实现一个要使用的异步迭代器,async for它应该以(大部分)固定间隔返回一个新值。

我们可以用一个简单的时钟来说明这样的迭代器,它每 ~n 秒增加一个计数器:

import asyncio

class Clock(object):
    def __init__(self, interval=1):
        self.counter = 0
        self.interval = interval
        self.tick = asyncio.Event()
        asyncio.ensure_future(self.tick_tock())

    async def tick_tock(self):
        while True:
            self.tick.clear()
            await asyncio.sleep(self.interval)
            self.counter = self.__next__()
            self.tick.set()

    def __next__(self):
        self.counter += 1
        return self.counter

    def __aiter__(self):
        return self

    async def __anext__(self):
        await self.tick.wait()
        return self.counter
Run Code Online (Sandbox Code Playgroud)

有没有比使用更好或更干净的方法asyncio.Event?不止一个协程会async for在这个迭代器上。

python asynchronous python-3.x python-asyncio

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

当也用作类型提示时如何处理额外的要求?

我想更新一个库,以便要求是可选的(使用extras_require)。

不幸的是,从可选需求导入的类在库中随处用作类型提示。这是一个例子:

from typing import List
try:
    from extra.sub import ExtraFoo, ExtraBar
except ImportError:
    pass

def optional(foo: ExtraFoo) -> List[ExtraBar]:
    pass

def greeting(name: str) -> str:
    return 'Hello ' + name

if __name__ == '__main__':
    greeting('John Smith')
Run Code Online (Sandbox Code Playgroud)

optional()在此示例中,如果extra未安装,我们将不会使用。事实上,这样的代码会引发一个NameErrorsinceExtraFooExtraBar用作类型提示。

一个可能的解决方法是在块中声明class ExtraFoo: passand 。然而,在同一模块中具有多种类型的代码中到处都存在这样的情况。class ExtraBar: passexcept

我想避免通过虚拟导入声明污染代码。有没有通用的方法来处理这种情况(例如代理模块)?

python setuptools python-import python-3.x python-importlib

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

如何使用 Lambda 代理通过 AWS Lambda 抛出 HTTP 错误代码?

我使用 Python 3.8 和Lambda 代理API 网关触发器创建了一个 AWS Lambda 函数: API网关

确实可以返回自定义 HTTP 错误代码:

def lambda_handler(event, context):
    return {
        'statusCode': 400,
        'body': json.dumps('This is a bad request!')
    }
Run Code Online (Sandbox Code Playgroud)

但是,一些在线示例(例如12)只是引发一个 Exception 以返回带有自定义消息的错误。如果在处理程序上抛出异常,如下所示,服务器将返回 502,因为响应不是代理集成的预期格式

def lambda_handler(event, context):
    raise Exception('This is an exception!')
Run Code Online (Sandbox Code Playgroud)

我认为这些示例依赖于一些集成响应模板并且不使用代理集成。是否可以使用 Lambda 代理实现相同的目的?我想避免在 Lambda 处理程序中全局捕获异常以构建自定义错误响应。

python amazon-web-services aws-lambda aws-api-gateway

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

当 __aenter__() 使用“async with”失败时会发生什么?

PEP 492提到:

async with EXPR as VAR:
    BLOCK
Run Code Online (Sandbox Code Playgroud)

在语义上等同于:

mgr = (EXPR)
aexit = type(mgr).__aexit__
aenter = type(mgr).__aenter__

VAR = await aenter(mgr)
try:
    BLOCK
except:
    if not await aexit(mgr, *sys.exc_info()):
        raise
else:
    await aexit(mgr, None, None, None)
Run Code Online (Sandbox Code Playgroud)

然而,VAR = await aenter(mgr)它不在try区块中,所以我想知道是否__aenter__()允许失败。

例如,在此aiohttp片段中(摘自入门):

import aiohttp
import asyncio

async def main():

    async with aiohttp.ClientSession() as session:
        async with session.get('http://python.org') as response:

            print("Status:", response.status)
            print("Content-type:", response.headers['content-type'])

            html = await response.text()
            print("Body:", html[:15], …
Run Code Online (Sandbox Code Playgroud)

python python-3.x python-asyncio semantics aiohttp

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

生成 DER 格式的 ECDSA 密钥对

我想使用 OpenSSL CLI生成DER 格式的secp256r1密钥对。

我正在使用以下命令:

$ openssl ecparam -name prime256v1 -outform der -genkey -out privkey.der
$ openssl ec -inform der -in privkey.der -pubout -outform der -out pubkey.der
Run Code Online (Sandbox Code Playgroud)

但是,第二个命令触发了无法加载密钥错误:

read EC key
unable to load Key
139911012984576:error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag:crypto/asn1/tasn_dec.c:1112:
139911012984576:error:0D07803A:asn1 encoding routines:asn1_item_embed_d2i:nested asn1 error:crypto/asn1/tasn_dec.c:274:Type=EC_PRIVATEKEY
139911012984576:error:10092010:elliptic curve routines:d2i_ECPrivateKey:EC lib:crypto/ec/ec_asn1.c:925:
Run Code Online (Sandbox Code Playgroud)

openssl ecdsa

0
推荐指数
1
解决办法
1029
查看次数