我想向一个 Python 函数添加类型,该函数接受类型作为参数(实际上是特定类的子类型),并返回该类型的实例。想象一个接受特定类型作为参数的工厂,例如:
T = TypeVar('T', bound=Animal)
def make_animal(animal_type: Type[T]) -> T: # <-- what should `Type[T]` be?
return animal_type()
Run Code Online (Sandbox Code Playgroud)
(显然这是一个非常简单的例子,但它演示了这种情况)
这感觉应该是可能的,但我找不到如何正确地键入提示。
我正在维护一个具有类似插件功能的小应用程序,它通过运行时加载的动态模块实现.
具体来说,因为它是一个Gtk +应用程序,我正在使用gmodule,但问题也适用于基于dlfcn.h/dlopen()的动态库加载.
我的主程序有一个包含一些全局信息的全局结构变量.我希望这些信息可用于动态加载的插件中定义的函数.
在Linux上,我可以直接引用这个全局变量 - 这很好用,我猜测gcc或链接器负责将全局变量从主程序导出到动态库.
问题是,这在Mac OS X上不起作用.有没有办法在OS X上执行此操作?
如果没有,是否有更多的"最佳实践"方法将全局信息公开给动态加载的库?
我一直尝试使用PHP的openssl扩展生成RSA密钥对,并将结果保存为OpenSSH兼容密钥对 - 意味着私钥是PEM编码(这很容易),公钥以OpenSSH特定格式存储以下形式:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABA...more base64 encoded stuff...
Run Code Online (Sandbox Code Playgroud)
据我所知,这种格式包括:
我尝试使用PHP的pack()函数实现这一点,但无论我尝试什么,结果永远不会等同于我ssh-keygen -y -f在openssl生成的相同RSA私钥上使用命令所得到的结果.
这是我的代码的简化版本:
<?php
// generate private key
$privKey = openssl_pkey_new(array(
'private_key_bits' => 1024,
'private_key_type' => OPENSSL_KEYTYPE_RSA
));
// convert public key to OpenSSH format
$keyInfo = openssl_pkey_get_details($privKey);
$data = pack("Na*", 7, 'ssh-rsa');
$data .= pack("Na*", strlen($keyInfo['rsa']['e']), $keyInfo['rsa']['e']);
$data .= pack("Na*", strlen($keyInfo['rsa']['n']), $keyInfo['rsa']['n']);
$pubKey = "ssh-rsa " . base64_encode($data);
echo "PHP generated RSA public key:\n$pubKey\n\n";
// For comparison, generate public …Run Code Online (Sandbox Code Playgroud) 我试图找出以“正确的方式”使用 SQLAlchemy 范围会话的正确方法,同时将定义会话的逻辑与配置分开并与使用会话分开。我多次被告知,一个好的方法是拥有一些全局 scoped_session 工厂,我可以在任何地方使用:
"""myapp/db.py
"""
from sqlalchemy.orm import sessionmaker, scoped_session
Session = scoped_session(sessionmaker())
Run Code Online (Sandbox Code Playgroud)
然后当我想使用它时:
"""myapp/service/dosomething.py
"""
from myapp.db import Session
def do_something(data):
"""Do something with data
"""
session = Session()
bars = session.query(Bar).all()
for bar in bars:
bar.data = data
session.commit()
Run Code Online (Sandbox Code Playgroud)
这似乎是正确的,但我的问题是在我看到的所有示例中,sessionmaker还会设置会话的一些参数,即最重要的是绑定引擎。这对我来说毫无意义,因为实际的数据库引擎将在导入myapp.db模块期间从全局范围内未知的配置中创建。
我所做的是在我的应用程序的“main”(或线程的 main 函数)中设置所有内容,然后假设会话是在其他地方配置的(例如在do_something()上面使用时):
"""myapp/main.py
"""
from sqlalchemy import create_engine
from myapp.db import Session
from myapp.service.dosomething import do_something
def main():
config = load_config_from_file()
engine = create_engine(**config['db'])
Session.configure(bind=engine)
do_something(['foo', 'bar'])
Run Code Online (Sandbox Code Playgroud)
这看起来是正确的方法吗?我还没有找到这种流程的任何好的例子,但我发现的大多数其他例子似乎过于简化或特定于框架。
我正在开发一个需要在HTML页面中解析URL(主要是HTTP URL)的应用程序 - 我无法控制输入,其中一些是正如预期的那样有点混乱.
我经常遇到的一个问题是,在解析和加入路径部分中包含双斜线的URL时,urlparse是非常严格的(甚至可能是错误的?),例如:
testUrl = 'http://www.example.com//path?foo=bar'
urlparse.urljoin(testUrl,
urlparse.urlparse(testUrl).path)
Run Code Online (Sandbox Code Playgroud)
而不是预期的结果http://www.example.com//path(甚至更好,使用标准化的单斜杠),我最终得到了http://path.
我正在运行这样的代码的原因是因为这是我到目前为止发现的唯一一种从URL中删除查询/片段部分的方法.也许有更好的方法,但我找不到一个.
任何人都可以推荐一种方法来避免这种情况,或者我应该使用(相对简单,我知道)正则表达式来自我规范化路径?
在V8中,我想通过向它添加一些函数来修改全局内置Array对象的原型.在JavaScript中,我会这样做,例如:
Array.prototype.sum = function() {
// calculate sum of array values
};
Run Code Online (Sandbox Code Playgroud)
如何在C++中实现相同的结果?我有一些全局函数模板添加到全局ObjectTemplate,但我不知道如何对所谓的原生对象原型做同样的事情.
我有以下结构的函数:
def get_something_from_data(data: Mapping[str, str], default: Optional[str] = None) -> Optional[str]:
"""Get something out of `data` if it is there, if not return the value of `default`.
If `default` is not provided, return None.
"""
Run Code Online (Sandbox Code Playgroud)
因此,Optional[str]如果default省略,则可以返回,或者str如果default有str值,则始终返回。
现在我用类似于以下的代码调用它:
has_value = get_something_from_data(data, "fallback")
return has_value.endswith("k")
Run Code Online (Sandbox Code Playgroud)
即使在这种情况下始终has_value是an ,但运行此代码会生成错误,因为它认为可能是并且不会有。strmypyhas_valueNoneendswith
所以我尝试以不同的方式输入我的函数:
DT = TypeVar('DT', str, None)
def get_something_from_data(data: Mapping[str, str], default: DT = None) -> Union[str, DT]: …Run Code Online (Sandbox Code Playgroud) 在基于 FastAPI 的 Web 应用程序中,我有一个 WebSocket 端点,仅当满足某些条件时才应允许连接,否则它应返回答复HTTP 404而不是升级与HTTP 101.
据我了解,协议完全支持这一点,但我找不到任何方法可以使用 FastAPI 或 Starlette 来做到这一点。
如果我有类似的东西:
@router.websocket("/foo")
async def ws_foo(request: WebSocket):
if _user_is_allowed(request):
await request.accept()
_handle_ws_connection(request)
else:
raise HTTPException(status_code=404)
Run Code Online (Sandbox Code Playgroud)
该异常不会转换为 404 响应,因为 FastAPIExceptionMiddleware似乎无法处理此类情况。
是否有任何本机/内置方式支持这种“拒绝”流程?