小编mel*_*r55的帖子

Monkeypatch 在单元测试中持续存在 python

我有一个自定义框架,它为不同的客户端运行不同的代码。我对某些方法进行了猴子修补,以便为客户定制功能。

这是简化的模式:

    #import monkeypatches here
    if self.config['client'] == 'cool_dudes':
        from app.monkeypatches import Stuff
    if self.config['client'] == 'cool_dudettes':
        from app.monkeypatches import OtherStuff
Run Code Online (Sandbox Code Playgroud)

这是一个补丁示例:

from app.framework.stuff import Stuff

def function_override(self):
  return pass

Stuff.function = function_override
Run Code Online (Sandbox Code Playgroud)

当程序以批处理方式执行时,这种方法效果很好,每次都从头开始旋转。然而,当运行单元测试时,我发现猴子补丁在测试中持续存在,导致意外的行为。

我意识到使用面向对象的继承方法来进行这些重写会好得多,但我继承了这个代码库,并且目前无权重新构建它到那种程度。

除非正确地重新构建程序,否则如何防止这些猴子补丁在单元测试中持续存在?

python unit-testing monkeypatching

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

任何类型的棉花糖田

我想指定一个棉花糖模式。对于我的一个字段,我不希望模式验证类型,而是简单地传递它。这是因为类型可以是任何东西,我们不知道提前。我没有看到这个选项marshmallow.fields。我们想将其用作解串器。

例如

class FilterSchema(Schema):
        op = fields.Str(required=True)
        val = fields.**Any**(required=True)
Run Code Online (Sandbox Code Playgroud)

有没有办法做这样的事情?

python serialization marshmallow

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

Pycharm调试器比正常运行慢得多

我正在尝试使用pycharm来调试ironpython脚本.它很糟糕,因为pycharm在调试模式下运行得非常慢.我意识到我们可以预期会有一些放缓,但我正在经历大约200倍的放缓.以下是我的pystone结果:

正常运行:

"C:\Program Files (x86)\IronPython 2.7\ipy.exe" C:/Users/melchoir55/PycharmProjects/pystone/pystone.py
Pystone(1.1) time for 50000 passes = 0.270744
This machine benchmarks at 184676 pystones/second
Run Code Online (Sandbox Code Playgroud)

调试器:

"C:\Program Files (x86)\IronPython 2.7\ipy.exe" -X:Frames "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 3.0.1\helpers\pydev\pydevd.py" --multiproc --client 127.0.0.1 --port 52669 --file C:/Users/melchoir55/PycharmProjects/pystone/pystone.py
pydev debugger: warning: sys._current_frames is not supported in Python 2.4, it is recommended to install threadframe module
pydev debugger: warning: See http://majid.info/blog/threadframe-multithreaded-stack-frame-extraction-for-python/
pydev debugger: process 9064 is connecting

Connected to pydev debugger (build 131.339)
Pystone(1.1) time for 50000 passes = 71.5615 …
Run Code Online (Sandbox Code Playgroud)

python debugging performance ironpython pycharm

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

Sentry 对象表示在完整视图中被截断

我们在 python 代码中使用哨兵。我们遇到了一个奇怪的问题,当我们尝试在哨兵中检查对象时,对象的表示被截断。例如,当用户进入“异常”视图并选择“完整”时,他们可以在堆栈跟踪中导航。在堆栈跟踪的每个段中,哨兵都会打印出对象的__repr__. 不幸的是,它似乎截断了较长的表示。这对我们来说是一个很大的问题。

对于那些好奇的人,我们已经尝试将我们设置string_max_length为 10,000,但它似乎对这些表示没有影响(尽管 captureMessage 现在发送更长的字符串)。

python logging truncate exception sentry

5
推荐指数
0
解决办法
809
查看次数

弹性豆茎需要 python 3.5

我最近使用最新的稳定版 python (3.5) 创建了一个新的 python 程序。遗憾的是,AWS EB 不提供 3.5 基础映像。我一直在尝试配置.ebextensions以获取图像以升级 python 发行版,因为它是第一个操作。我没有成功。我尝试了以下方法:

套餐

packages:
    yum:
        postgresql93-devel: []
        python35: []
Run Code Online (Sandbox Code Playgroud)

命令

container_commands:
      01_install_packages:
        command: 'yum install -y python35 python35-pip' 
Run Code Online (Sandbox Code Playgroud)

在 的情况下container_commands,日志确实显示成功安装了 python 35。但是,我们的代码(在后续命令中)然后以一种只有在源代码为 3.4 或更低版本的 python 时才有可能的方式失败。我假设虽然安装了3.5,但环境没有切换到它作为源,继续使用3.4发行版。

我们不能手动修改环境,因为我们需要我们的配置为自动扩展做好准备。因此,解决方案必须来自.ebextensions. 这里的任何帮助将不胜感激。

更新

我收到一封来自 AWS 支持的电子邮件,通知我,由于操作系统和应用程序 python 环境紧密耦合(即相同),因此无法将应用程序的默认 python 版本更改为 python 3.5。他们建议我创建一个 docker 镜像。我已经开始研究如何做到这一点。如果我想出一个解决方案,我会在这里发布。

python amazon-web-services python-3.x amazon-elastic-beanstalk ebextensions

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

kie workbench部署战争不起作用(tomcat)

我已经下载了kie工作台并提取了kie-drools-wb-distribution-wars-6.2.0.Final-tomcat7.war.我之前从未使用过tomcat,但是我想使用工作台,似乎没有工作台可以自行调整的选项.因此,我安装了tomcat 8.执行此操作后,我访问了tomcat管理器并部署了战争.(我不得不增加可接受文件大小的内存限制)

我现在已经/kie-drools-wb-distribution-wars-6.2.0.Final-tomcat7列为一个应用程序,但它不会启动.当我尝试启动它时,我得到以下内容:

FAIL - Application at context path /kie-drools-wb-distribution-wars-6.2.0.Final-tomcat7 could not be started
FAIL - Encountered exception org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/kie-drools-wb-distribution-wars-6.2.0.Final-tomcat7]]
Run Code Online (Sandbox Code Playgroud)

这是catalina日志文件:

01-Apr-2015 18:51:54.136 SEVERE [localhost-startStop-1] org.apache.catalina.startup.ContextConfig.processContextConfig Parse error in context.xml for /kie-drools-wb-distribution-wars-6.2.0.Final-tomcat7
 org.xml.sax.SAXParseException; systemId: file:/opt/apache-tomcat-8.0.21/webapps/kie-drools-wb-distribution-wars-6.2.0.Final-tomcat7/META-INF/context.xml; lineNumber: 17; columnNumber: 81; Error at (17, 81) : bitronix.tm.integration.tomcat55.BTMLifecycleListener
    at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:1914)
    at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:1946)
    at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1187)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
    at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:182)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1343)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2786)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at …
Run Code Online (Sandbox Code Playgroud)

java tomcat drools kie

4
推荐指数
1
解决办法
9206
查看次数

SqlAlchemy mysql毫秒或微秒精度

我一直在冒险试图让我的数据库中的小数时间分辨率正常工作.我使用python方法datetime.now()来创建日期对象.然后我将这些对象存储在一个字段中,该字段映射到一个COLUMN(DATETIME(9))来自SqlAlchemy库的字段.最初,我收到的错误是我的数据被截断了.这是因为我使用的是mysql 5.5.我已经更新到5.6.19并且不再获得数据截断错误.

但是,数据库实际上仍然不包含小数时间条目.例如,以下是实例化datetime.now()对象时的值:

2015-04-17 16:31:12.804444
Run Code Online (Sandbox Code Playgroud)

以上就是我所期待的.内存中的对象具有微秒分辨率.现在,在将它保存到mysql数据库之后,如果我打开mysql命令行客户端并使用select语句返回行,我会看到以下值:

2015-04-17 16:31:13
Run Code Online (Sandbox Code Playgroud)

显然,该值将四舍五入到最接近的秒.这很糟糕,我不知道是什么导致它!

如果它是相关的,我使用mysql-connector-python == 2.0.3

更新:我也试过使用COLUMN(DATETIME(6)),但得到了相同的行为.

如果信息相关,我在下面包括模型:

class User(Base):
        __tablename__ = 'Users'

        uid = Column(INT, primary_key=True, autoincrement=True)
        dateCreated = Column(DATETIME(6))

        def __init__(self, *args, **kwargs):
                super(user, self).__init__(*args, **kwargs)
                self.dateCreated = datetime.now()
Run Code Online (Sandbox Code Playgroud)

更新:佩德罗的建议不是问题,尽管它确实帮助我取得了进步,非常感谢.我尝试单步执行sql连接器中的代码,直到我进入mysql insert语句.该陈述确实包含小数时间值.但是,执行时,该值将四舍五入.当我在桌面上做了​​一个描述时,我注意到日期时间类型就是datetime它应该真的datetime(6).

我使用的SA模型,其中明确声明生成数据库本身Column(DATETIME(6)),和Base.metadata.create_all(self.db, checkfirst=True),所以我不明白为什么(6)在实际的表结构不结束了.我想我很快就会明白,我会在发布时发布更新.

更新:DATETIME的构造函数不接受字段长度规范.时区只需要一个参数.我不清楚如何指定日期时间字段的长度,因为对于类似varchar的类型,只需将其传递给构造函数.潜水继续.

python mysql datetime sqlalchemy milliseconds

4
推荐指数
1
解决办法
4787
查看次数

单元测试Java Spark微框架

我正在尝试为java微服务添加一个restful api.为此,我使用spark:

http://sparkjava.com/documentation.html

我创建了一个非常简单的类,它代表了api.那堂课在这里:

public class Routes {
    public void establishRoutes(){
        get("/test", (req, res) -> "Hello World");
        after((req, res) -> {
            res.type("application/json");
        });

        exception(IllegalArgumentException.class, (e, req, res) -> {
            res.status(400);
        });
    }
Run Code Online (Sandbox Code Playgroud)

现在,运行Routes.establishRoutes()应该站起来,如果有人决定访问http:// localhost:4567/test,它将显示"Hello World" .这确实有效.欢呼!

下一步是对代码进行单元测试.不幸的是,我的单元测试没有成功.spark文档没有详细说明进行测试的合理方式,因此我所拥有的内容是根据我在网络上找到的示例拼凑而成的.这是我的Junit测试:

public class TestRoutes {
        @Before
        public void setUp() throws Exception {
            Routes newRoutes = new Routes();
            newRoutes.establishRoutes();
        }

        @After
        public void tearDown() throws Exception {
            stop();
        }

        @Test
        public void testModelObjectsPOST(){

            String testUrl = "/test";


            ApiTestUtils.TestResponse res = ApiTestUtils.request("GET", testUrl, null); …
Run Code Online (Sandbox Code Playgroud)

java rest junit unit-testing spark-java

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

强制弹簧启动杰克逊解串器使用BigDecimal

我有一个问题,其中杰克逊将数字值反序列化为我无法预测的任意类型。例如,如果有人传递值“ 14”,则杰克逊会将其实例化为Integer。但是,如果有人传递值“ 14.01”,则杰克逊会将其实例化为Double。这是一个问题,因为我有一个自定义解串器(@JsonCreator),由于无法预测将字段强制转换为BigDecimal,因此会引发异常。理想情况下,杰克逊将一切变成了BigDecimal

我发现一篇帖子暗示杰克逊可能有能力做这样的事情。 在Jackson中将JSON反序列化为通用映射,强制将所有JSON浮点数转换为Decimal或String

但是,我无法弄清楚如何访问隐藏在Spring Boot中的mapper对象以运行适​​当的方法 mapper.enable()

这是反序列化器的代码段:

@JsonCreator
public OptionTransaction(Map<String,Object> jsonObj){  
    Map<String,Object> jsonOption = (Map<String, Object>) jsonObj.get("option");

    Map<String,Object> optionPriceObj = (Map<String, Object>) jsonOption.get("price");
    BigDecimal optionValue = new BigDecimal((Double) optionPriceObj.get("value"));
Run Code Online (Sandbox Code Playgroud)

正如您在上面看到的那样,该转换Double是一个问题,因为杰克逊有时无法获得双打。有谁知道一种让杰克逊始终输出BigDecimals或什至只是字符串的简单方法?

更新:

至于将双打转换为BigDecimal,我可以通过以下方式修改application.properties来实现:

# ===============================
# = DESERIALIZATION CUSTOMIZATION
# ===============================
spring.jackson.deserialization.USE_BIG_DECIMAL_FOR_FLOATS=true
Run Code Online (Sandbox Code Playgroud)

java serialization spring json jackson

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

flask admin单击时编辑子对象

Flask-Admin在其标准编辑视图中显示由关系定义的子对象。例如,如果User对象有Address子对象,则查看的编辑视图UserAddress在适当的字段中显示子对象。然后,用户可以删除该对象,或添加另一个对象。

我希望用户能够单击或以其他方式进入子对象的编辑视图。在我描述的示例中,用户应该能够Address直接从对象的编辑视图访问对象的编辑视图User

我发现的唯一相关内容是inline_models,但这不是解决方案。该实现非常脆弱(例如,它不能处理长距离关系)。Flask-Admin知道子对象!我可以在视图中看到它们!我只希望他们成为他们自己的编辑视图的链接...

任何人都知道如何实现这一目标,或者可以链接到示例吗?

python relationship flask-admin

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