我有一个自定义框架,它为不同的客户端运行不同的代码。我对某些方法进行了猴子修补,以便为客户定制功能。
这是简化的模式:
#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)
当程序以批处理方式执行时,这种方法效果很好,每次都从头开始旋转。然而,当运行单元测试时,我发现猴子补丁在测试中持续存在,导致意外的行为。
我意识到使用面向对象的继承方法来进行这些重写会好得多,但我继承了这个代码库,并且目前无权重新构建它到那种程度。
除非正确地重新构建程序,否则如何防止这些猴子补丁在单元测试中持续存在?
我想指定一个棉花糖模式。对于我的一个字段,我不希望模式验证类型,而是简单地传递它。这是因为类型可以是任何东西,我们不知道提前。我没有看到这个选项marshmallow.fields。我们想将其用作解串器。
例如
class FilterSchema(Schema):
op = fields.Str(required=True)
val = fields.**Any**(required=True)
Run Code Online (Sandbox Code Playgroud)
有没有办法做这样的事情?
我正在尝试使用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 代码中使用哨兵。我们遇到了一个奇怪的问题,当我们尝试在哨兵中检查对象时,对象的表示被截断。例如,当用户进入“异常”视图并选择“完整”时,他们可以在堆栈跟踪中导航。在堆栈跟踪的每个段中,哨兵都会打印出对象的__repr__. 不幸的是,它似乎截断了较长的表示。这对我们来说是一个很大的问题。
对于那些好奇的人,我们已经尝试将我们设置string_max_length为 10,000,但它似乎对这些表示没有影响(尽管 captureMessage 现在发送更长的字符串)。
我最近使用最新的稳定版 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
我已经下载了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) 我一直在冒险试图让我的数据库中的小数时间分辨率正常工作.我使用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的类型,只需将其传递给构造函数.潜水继续.
我正在尝试为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) 我有一个问题,其中杰克逊将数字值反序列化为我无法预测的任意类型。例如,如果有人传递值“ 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) Flask-Admin在其标准编辑视图中显示由关系定义的子对象。例如,如果User对象有Address子对象,则查看的编辑视图User将Address在适当的字段中显示子对象。然后,用户可以删除该对象,或添加另一个对象。
我希望用户能够单击或以其他方式进入子对象的编辑视图。在我描述的示例中,用户应该能够Address直接从对象的编辑视图访问对象的编辑视图User。
我发现的唯一相关内容是inline_models,但这不是解决方案。该实现非常脆弱(例如,它不能处理长距离关系)。Flask-Admin知道子对象!我可以在视图中看到它们!我只希望他们成为他们自己的编辑视图的链接...
任何人都知道如何实现这一目标,或者可以链接到示例吗?
python ×7
java ×3
unit-testing ×2
datetime ×1
debugging ×1
drools ×1
ebextensions ×1
exception ×1
flask-admin ×1
ironpython ×1
jackson ×1
json ×1
junit ×1
kie ×1
logging ×1
marshmallow ×1
milliseconds ×1
mysql ×1
performance ×1
pycharm ×1
python-3.x ×1
relationship ×1
rest ×1
sentry ×1
spark-java ×1
spring ×1
sqlalchemy ×1
tomcat ×1
truncate ×1