小编mik*_*ike的帖子

最简洁的方法将生成的Flask应用程序代码(Swagger-Codegen)粘贴到后端实现

我有:

  1. 一个做[Stuff]的库
  2. 一个昂首阔步的API定义,大致相当于#1,只是略有不同,可以干净地映射到REST服务
  3. 使用Swagger-Codegen生成#2的烧瓶应用程序 - 例如,导致python控制器函数与#1大致一对一.

我的意图是烧瓶应用程序(所有生成的代码)应该只处理实际REST api和参数解析的映射,以匹配swagger中编码的API规范.在任何参数解析(再次生成代码)之后,它应该直接调用我的(非生成的)后端.

我的问题是,如何通过手工编辑生成的python/flask代码来解决这些问题?(对我的设计的反馈,或实现这一点的正式设计模式的细节也会很棒;我是这个领域的新手).

从发生器新鲜,我最终得到python函数,如:

def create_task(myTaskDefinition):
    """
    comment as specified in swagger.json
    :param myTaskDefinition: json blah blah blah
    :type myTaskDefinition: dict | bytes
    :rtype: ApiResponse
    """
    if connexion.request.is_json:
        myTaskDefinition = MyTaskTypeFromSwagger.from_dict(connexion.request.get_json())
    return 'do some magic!' # swagger codegen inserts this string :)
Run Code Online (Sandbox Code Playgroud)

在后端我有我的实际逻辑:

def create_task_backend(myTaskDefinition):
    # hand-coded, checked into git: do all the things
    return APIResponse(...)
Run Code Online (Sandbox Code Playgroud)

什么是正确的create_task()打电话方式create_task_backend()

当然,如果我对我的swagger规范进行重大更改,我将不得不手动更新未生成的代码; 但是,我可能想要重新生成我的API有很多原因(比如,添加/优化MyTaskTypeFromSwagger类,或者完全跳过检查git生成的代码),如果我必须手工编辑生成的API代码,那么所有这些每次重新生成时,编辑都会被吹走.

当然,我可以用例如一个简单的语法编写脚本.pyparsing; 虽然这是我第一次遇到这个问题,但它似乎已经被广泛解决了!

python rest flask swagger swagger-codegen

16
推荐指数
2
解决办法
4175
查看次数

在visual studio中卸载/重新加载符号/ pdb

我在visual studio 2008中,需要卸载一个特定的模块.

在windbg中,这将完成

.reload -u
Run Code Online (Sandbox Code Playgroud)

但我找不到它在VS中的对应物,或与重新加载有关的任何功能)

谢谢!

debugging symbols windbg visual-studio-2008 visual-studio

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

如何为OpenAPI 3.0.0运行swagger-codegen

貌似官方规范V3支持接近释放https://blog.readme.io/an-example-filled-guide-to-swagger-3-2/和招摇,代码生成了3.0.0支持开发并在分支上传递一定程度的测试https://github.com/swagger-api/swagger-codegen3.0.0

我有一个swagger规范(从我现有的2.0规范通过https://github.com/mermade/swagger2openapi生成,输出看起来不错)

是否有一种简单的方法来运行swagger-codegen而无需自己打包jar?

[main] INFO io.swagger.parser.Swagger20Parser - 从/input/myspec.openapi3.json读取[main] INFO io.swagger.codegen.ignore.CodegenIgnoreProcessor - 找不到.swagger-codegen-ignore文件.线程"main"中的异常java.lang.RuntimeException:缺少swagger输入或配置!at io.swagger.codegen.DefaultGenerator.generate(DefaultGenerator.java:685)at io.swagger.codegen.cmd.Generate.run(Generate.java:285)at io.swagger.codegen.SwaggerCodegen.main(SwaggerCodegen.java) :35)

看起来swagger-codegen repo 你构建之后运行一个docker容器有一些支持的方式; 我只是希望/猜测有一种支持的方法来做到这一点,而不需要在本地编译,因为我需要在几个地方设置它.

swagger openapi swagger-codegen

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

用于验证等式运算符的C++测试随着时间的推移与struct保持一致

我对@TomalakGeretkal投了一份关于合同的好记录; 我还没有接受答案,因为我的问题是如何以编程方式检查equals函数.


我有一个POD结构和一个相等运算符,一个(非常)一小部分系统,有> 100名工程师.

随着时间的推移,我希望修改结构(成员添加/删除/重新排序),我想编写一个测试来验证相等操作是否正在测试结构的每个成员(例如,随着结构的变化保持最新).

正如Tomalak指出的那样 - 评论和"按合同"通常是执行此操作的最佳/唯一方式; 但是在我的情况下,我期待问题,并希望探索是否有任何方法可以主动捕获(至少很多)修改.

我没有得到满意的答案 - 这是我想到的最好的答案:

-new up two instances struct (x, y), fill each with identical non-zero data.
-check x==y
-modify x "byte by byte"
    -take ptr to be (unsigned char*)&x
    -iterator over ptr (for sizeof(x))
        -increment the current byte
        -check !(x==y)
        -decrement the current byte
        -check x==y
Run Code Online (Sandbox Code Playgroud)

如果相等运算符捕获了每个字节,则测试通过(注意:对此有一个警告 - 并非所有字节都在x的编译器表示中使用,因此测试必须'跳过'这些字节 - 例如硬编码忽略字节)

我提议的测试存在重大问题:(至少)'不关心'字节,以及增加x中类型的一个字节的事实可能不会导致该存储器位置处的变量的有效值.

更好的解决方案?

(这应该没关系,但我使用VS2008,rtti关闭,googletest套件)

c++ testing

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

协议缓冲区 - 生成非内联访问器

我们在具有c#c ++代码的中型嵌入式系统中使用协议缓冲区(2.4.1).我们使用protobufs来隔离我们的托管和本机层,以及易于维护的序列化层(对于好奇,我们刚刚使用了Pinvoke,但我们还必须在测试/模拟器上的单独进程中运行本机代码).

我们的系统有许多DLL,我在它自己的DLL中有生成的本机protobuf代码,这样系统的其他部分就不必直接链接生成的代码.

我遇到的问题是所有生成的访问器都是内联的,例如:

inline const ::MyProtoClassName::MyField& MyProtoClassName::myfield() const 
{ 
   return myfield_ != NULL ? *myfield_ : *default_instance_->myfield_; 
}
Run Code Online (Sandbox Code Playgroud)

使用生成的API大小(如果未设置此特定字段,则取消引用并访问' default_instance_ ').这意味着我无法使用访问器链接(lnk2001)任何客户端,因为没有符号default_instance_

我认为ProtoBufs的典型用例是在生成的protobuf代码本身中包含每个组件链接(毕竟,这主要是分布式系统的序列化层),但是

我想知道是否有一个编译开关来改变我错过的内联行为.(在CC文件中定义所有访问器,而不是H)

谢谢!


  • 谢谢@ g-makulik!看起来答案是在ProtoC代码中大约30行,我只是没有看到它:)

    • <请参阅下面的答案,了解大部分解决方案>这也应该对您有所帮助.

正如Kenton的一些更改日志中所述,添加此项会导致与基础类相关的多个警告(C4251,c4275),这些警告也不是DLLEXPORT'd

通过ProtoBufs的实现方式,protobuf类是所有模板,这些警告都是良性的.要彻底忽略它们(例如,不必为所有客户端禁用警告),我使用了这种有点hacky的方法:

-wrapone包含的protobuf.h文件的包装器.(没有人包含真正生成的H文件)

    #pragma once
    #pragma warning(push)  
    #pragma warning(disable:4251)  
    #pragma warning(disable:4275)  
    // include the protobuf generated code; but exclude the warn c4251, c4275  
    // these relate to the dll exported     
    #include "yourProtoFile.h"  
    #pragma warning(pop)  
Run Code Online (Sandbox Code Playgroud)

和一个包装器C文件(真正的protobuf CC文件不在我的项目中 - >不是直接构建的)

#include "MyProtoFile_WRAPPER.h"  
#include "MyProtoFile.cc"
Run Code Online (Sandbox Code Playgroud)

c++ windows protocol-buffers

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

为什么sizeof(ptrdiff_t)== sizeof(uintptr_t)

我看到几个关于size_t与uintptr_t/ptrdiff_t的帖子(例如size_t与uintptr_t),但没有关于这些新的c99 ptr大小类型的相对大小.

示例机器:vanilla ubuntu 14lts x64,gcc 4.8:

printf("%zu, %zu, %zu\n", sizeof(uintptr_t), sizeof(intptr_t), sizeof(ptrdiff_t));
Run Code Online (Sandbox Code Playgroud)

打印:"8,8,8"

这对我来说没有意义,因为我期望必须签名的diff类型需要比unsigned ptr本身更多的位.

考虑:

NULL - (2^64-1)  /*largest ptr, 64bits of 1's.*/
Run Code Online (Sandbox Code Playgroud)

这是2的补码负数不适合64位; 因此我希望ptrdiff_t大于ptr_t.

[一个相关的问题是为什么intptr_t与uintptr_t的大小相同....虽然我很舒服这可能只是为了允许一个带符号的类型来包含表示的位(例如,在负ptr上使用带符号的算法将是(a)be undefined,和(b)实用性有限,因为ptrs根据定义是"正面的")]

谢谢!

c c++ pointers c99 computer-architecture

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

python环境案例感性 - os.environ [...]

我需要以独立于平台的方式访问进程的环境块.

蟒蛇os模块文档没有指定有关的大小写什么os.environ/ os.getenv.在我的ubuntu和win7开发盒上进行试验,我看到os.environ在Linux上区分大小写但在Windows上不区分(这反映了set两个平台上的行为)

由于dict对于字符串键显然是区分大小写的,所以返回的值似乎os.environ只是作为dict的鸭子类型 ...

问题: 在哪里/如何能够找到关于此行为的明确答案?我宁愿有一个真正的答案,而不仅仅是凭经验确定它:)

或者,os.getenv(...)是一个更好的api使用?为什么?

谢谢!

python

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

Python PIP找不到pywin32(在windows上)

我已经安装了python 3.5,需要安装pywin(pywin32)

但是,pip无法找到它.注意,我已成功安装PIP installeded send2trash和gitpython

 Could not find a version that satisfies the requirement pywin32 (from versions: )
Run Code Online (Sandbox Code Playgroud)

一些可能相关的数据点:

  • 新安装的python 3.5
  • Windows 7 x64
  • python 2.7以前安装在机器上
  • 如上所述,通过PIP可以很好地安装其他几个软件包
  • 从git-bash运行这些命令,这些命令来自git windows安装程序,安装前一段时间. - 我的路径中有gnu grep,所以我相信我选择了git installer选项将整个mysys工具链放在我的路径中

完整的--verbose输出:

C:\Users\USER>pip install  pywin32    --proxy http://proxy.COMPANY.com:8080
Collecting pywin32
  Could not find a version that satisfies the requirement pywin32 (from versions: )
No matching distribution found for pywin32

C:\Users\USER>pip install  pywin32    --proxy http://proxy.COMPANY.com:8080 --verbose
Config variable 'Py_DEBUG' is unset, Python ABI tag may be incorrect
Config variable 'WITH_PYMALLOC' …
Run Code Online (Sandbox Code Playgroud)

python pip python-3.x

5
推荐指数
2
解决办法
2万
查看次数

使用 pydantic.dataclasses 时向 Pydantic 模式添加“描述”

Pydantic支持生成 OpenApi/jsonschema 模式。当使用 PydanticBaseModel定义模型时,可以将description和添加title到生成的 json/yaml 规范中。

class DescriptionFromBasemodel(BaseModel):
    with_desc: int = Field(
        42,
        title='my title',
        description='descr text',)
Run Code Online (Sandbox Code Playgroud)

这被转移到模式中:DescriptionFromBasemodel.schema_json()

{
    ... schema title, description, type top-level ...
    "properties": {
        "with_desc": {
            "title": "my title",
            "description": "descr text",
            "type": ...
       ...
Run Code Online (Sandbox Code Playgroud)

但是,我无法确定如何使用它来探索它,pydantic.dataclasses我的应用程序必须使用它才能在其他地方正常运行。您可以添加metadata到 stdlib dataclass Field(...),但 pydantic 不使用它们(?)

from pydantic.dataclasses import dataclass
from dataclasses import field

@dataclass
class DataclassWithDescription:
   a_field: int = field(metadata=dict(
       description="descr text"))
Run Code Online (Sandbox Code Playgroud)

并且没有description使用生成输出DataclassWithDescription.__pydantic_model__.schema_json()

python-3.x swagger openapi pydantic

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

pytest log_cli + 标准日志记录 = 破坏 doctest

我们正在使用pytestpython std logging,并在 s 中进行一些测试doctest。我们希望能够使log_cliide 中的调试测试变得更容易(让我们stderr流向“实时”控制台,这样人们就可以看到单步执行时输出的日志语句)问题是“使用”之间似乎存在错误/迭代”(例如logging存在对等的调用logger.info("...")log_cli=true

我在文档中没有看到任何其他标志或提及这一点,因此它似乎是一个错误,但希望有一个解决方法。

该测试模块通过:

# bugjar.py
"""
>>> dummy()
'retval'
"""
import logging
logger = logging.getLogger(__name__)
def dummy():
    # logger.info("AnInfoLog")  ## un-comment to break test
    return "retval"
Run Code Online (Sandbox Code Playgroud)

但取消注释(没有其他更改)调用logger.info(会导致失败:(除非我log_cli从中删除pytest.ini

002 >>> dummy()
Expected:
    'retval'
Got nothing
Run Code Online (Sandbox Code Playgroud)

这是我的命令行和相关版本输出:

(venv) $ ./venv/bin/pytest -c ./pytest.ini ./bugjar.py
======================================================================= test session starts ========================================================================
platform linux -- Python 3.8.5, pytest-6.2.2, py-1.10.0, pluggy-0.13.1 …
Run Code Online (Sandbox Code Playgroud)

python doctest pytest python-3.x

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