小编Dar*_*zak的帖子

如何警告类(名称)弃用

我重命名了一个python类,它是库的一部分.我愿意在一段时间内使用其以前的名称,但是我想警告用户它已被弃用,将来会被删除.

我认为,为了提供向后兼容性,使用类似的别名就足够了:

class NewClsName:
    pass

OldClsName = NewClsName
Run Code Online (Sandbox Code Playgroud)

我不知道如何以OldClsName优雅的方式标记为已弃用.也许我可以创建OldClsName一个发出警告(记录)并NewClsName从其参数构造对象的函数(使用*args**kvargs)但它看起来不够优雅(或者它可能是?).

但是,我不知道Python标准库弃用警告是如何工作的.我想可能有一些很好的魔法来处理弃用,例如允许根据某些解释器的命令行选项将其视为错误或静默.

问题是:如何警告用户使用过时的类别名(或一般的过时类).

编辑:函数方法对我不起作用(我已经试过了)因为类有一些类方法(工厂方法),当OldClsName定义为函数时无法调用.以下代码不起作用:

class NewClsName(object):
    @classmethod
    def CreateVariant1( cls, ... ):
        pass

    @classmethod
    def CreateVariant2( cls, ... ):
        pass

def OldClsName(*args, **kwargs):
    warnings.warn("The 'OldClsName' class was renamed [...]",
                  DeprecationWarning )
    return NewClsName(*args, **kwargs)

OldClsName.CreateVariant1( ... )
Run Code Online (Sandbox Code Playgroud)

因为:

AttributeError: 'function' object has no attribute 'CreateVariant1'
Run Code Online (Sandbox Code Playgroud)

继承是我唯一的选择吗?说实话,它对我来说看起来不太干净 - 它通过引入不必要的派生来影响类层次结构.此外,OldClsName is not NewClsName在大多数情况下,这不是问题,但如果使用该库的代码编写不当,可能会出现问题.

我还可以创建一个虚拟的,不相关的OldClsName类,并为其中的所有类方法实现构造函数和包装器,但在我看来,这是更糟糕的解决方案.

python class backwards-compatibility deprecation-warning

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

如何显式引用字符串值(Python DB API/Psycopg2)

出于某些原因,我想明确引用字符串值(成为构造的SQL查询的一部分),而不是等待cursor.execute方法对其第二个参数的内容执行的隐式引用.

通过"隐含引用"我的意思是:

value = "Unsafe string"
query = "SELECT * FROM some_table WHERE some_char_field = %s;"
cursor.execute( query, (value,) ) # value will be correctly quoted
Run Code Online (Sandbox Code Playgroud)

我更喜欢这样的东西:

value = "Unsafe string"
query = "SELECT * FROM some_table WHERE some_char_field = %s;" % \
    READY_TO_USE_QUOTING_FUNCTION(value)
cursor.execute( query ) # value will be correctly quoted, too
Run Code Online (Sandbox Code Playgroud)

这是READY_TO_USE_QUOTING_FUNCTIONPython DB API规范所期望的低级别(我在PEP 249文档中找不到这样的功能).如果没有,也许Psycopg2提供这样的功能?如果没有,也许Django提供这样的功能?我不想自己写这样的功能......

python sql django psycopg2

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

如何使用if /或/和函数检查变量是否等于两个值之一

在GNU makefile中,如果输入变量等于两个值中的一个,我想将输出变量设置为一个值(假设为"true"),如果输入变量不等于另一个值("false").

感谢这个SO答案,我已经了解了这些andor功能,不久之后我就找到了这个if功能.这些函数似乎在我的make版本中可用,所以我想使用它们.我想写这样的东西:

TEST_INPUT = `hostname`
TEST_OUTPUT = $(if $(or $(eq $(TEST_INPUT),hal9000),
                        $(eq $(TEST_INPUT),pipboy)),true,false)
Run Code Online (Sandbox Code Playgroud)

不幸的是我不能,因为我找不到任何明显形式的预期eq功能.我能够使用该filter功能实现我想要的:

TRUE_HOSTS = hal9000 pipboy
TEST_OUTPUT = $(if $(filter $(TEST_INPUT),$(TRUE_HOSTS)),true,false)
Run Code Online (Sandbox Code Playgroud)

subst功能:

TEST_OUTPUT = $(if $(and $(subst hal9000,,$(TEST_INPUT)),
                         $(subst pipboy,,$(TEST_INPUT))),
                   false,true)
Run Code Online (Sandbox Code Playgroud)

但对我来说,它不是一个漂亮的外观也不是可读的代码.是否有更接近第一个示例的解决方案(使用不存在eq函数的解决方案)?也许我没有达到目的if,and而且or功能完全没有?

gnu-make

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

如何避免MySQLdb的"命令不同步;您现在无法运行此命令"(2014)异常

下面的代码,使用python 2.6.6和MySQLdb 1.2.2导致命令不同步; 你现在无法运行此命令 MySQLdb异常:

import MySQLdb

conn = MySQLdb.connect( db="test", user="root" )
cursor = conn.cursor( MySQLdb.cursors.DictCursor )

cursor.execute( "BEGIN; CREATE TABLE t1 ( t1_id INT PRIMARY KEY AUTO_INCREMENT ); COMMIT;" )
cursor.execute( "BEGIN; CREATE TABLE t2 ( t2_id INT PRIMARY KEY AUTO_INCREMENT ); COMMIT;" )
Run Code Online (Sandbox Code Playgroud)

在执行第二个查询期间引发异常.正如我所读到的,异常通常是由MySQL的C API实现的限制引起的,这种实现不允许并发查询执行.

如果我在上面两个查询之间重新创建游标对象,问题就解决了,但不幸的是,解决方案对我来说似乎并不完美.我有一个非常简单的数据库连接和查询执行的abstration,并且不希望在每次查询执行后重新创建游标(据我所知)提交当前事务并可能有其他副作用.

因此,我的问题是:避免这种例外的其他方法是什么?如何准备游标对象以执行下一个查询?也许Python DB API有一些预期的方法,在使用其他数据库接口时会相对中立,并且在MySQLdb的情况下会解决这个问题吗?

在此先感谢您的时间和帮助:)

编辑: 在我发布问题后,我开始阅读Python DB API规范,阅读有关游标销毁的副作用(我不太确定事务提交:))我发现以下,替代解决方法:

cursor.execute( "BEGIN; CREATE TABLE t1 ( t1_id INT PRIMARY KEY AUTO_INCREMENT ); COMMIT;" )
while cursor.nextset() is not None: pass
cursor.execute( "BEGIN; …
Run Code Online (Sandbox Code Playgroud)

python mysql

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

如何从SQLAlchemy检索已执行的SQL代码

我正在使用SQLAlchemy并希望记录执行的 SQL代码(即已引用和替换所有绑定参数的代码).在psycopg2的情况下,可以使用对象的query属性Cursor(请参阅psycopg文档).在MySQLdb的情况下,可以使用对象的_last_executed属性Cursor.

我的问题是:如何使用SQLAlchemy接口检索刚刚执行的查询字符串?它是提供这样的功能还是我应该编写自己的帮助函数?

在此先感谢您的帮助.

python sqlalchemy

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

如何检查二进制文件是否是从特定来源构建的

我正在处理的遗留项目包括一些二进制jar文件形式的外部库.我们决定对于分析和潜在的修补,我们希望接收这个库的源代码,使用它们来构建新的二进制文件,并在经过详细和足够长的回归测试后切换到这些二进制文件.

假设我们已经检索并构建了源(我实际上处于计划阶段).在进行实际测试之前,我想执行一些"兼容性检查",以排除源代表与"旧"二进制文件中的内容截然不同的可能性.

使用该javap工具,我能够提取用于编译的JDK版本(至少我相信它是JDK的版本).它说,二进制文件是使用主要版本46和次要版本0构建的.根据这篇文章,它映射到JDK 1.2.

假设相同的JDK将用于源编译.

问题是:有没有验证的可靠的和可能有效的方法,如果这两个二进制文件是由相同的源代码构建的?我想知道所有方法签名和类定义是否相同,以及大多数或可能所有方法实现是否相同/相似.

该库非常大,所以我认为对反编译二进制文件的详细分析可能不是一种选择.

java reverse-engineering

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

NUnit的ExpectedExceptionAttribute是否只能测试是否会引发异常?

我是C#和NUnit的全新人物.

在Boost.Test中有一系列BOOST_*_THROW宏.在Python的测试模块中有TestCase.assertRaises方法.

据我所知,在C#中使用NUnit(2.4.8)进行异常测试的唯一方法就是使用ExpectedExceptionAttribute.

为什么我更喜欢ExpectedExceptionAttribute- 比如说 - Boost.Test的方法?这个设计决定背后有什么推理?为什么在C#和NUnit的情况下会更好?

最后,如果我决定使用ExpectedExceptionAttribute,在引发异常并获取异常后,如何进行一些额外的测试?假设我想测试需求,说明在一些setter引发之后对象必须是有效的System.IndexOutOfRangeException.您将如何修复以下代码以按预期编译和工作?

[Test]
public void TestSetterException()
{
    Sth.SomeClass obj = new SomeClass();

    // Following statement won't compile.
    Assert.Raises( "System.IndexOutOfRangeException",
                   obj.SetValueAt( -1, "foo" ) );

    Assert.IsTrue( obj.IsValid() );
}
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢你的回答.今天,我发现了一个It's Tests 博客文章,其中提到了你描述的所有三种方法(还有一个小的变化).遗憾的是我以前找不到它:-(.

c# nunit exception

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

用PHP进行精确的实数运算

在PHP中表示实数的字符串上进行基本算术运算的最快速,最简单的方法是什么?我有一个字符串表示我想要操作的MySQL的DECIMAL值,然后将结果返回给数据库.我想避免浮点实数表示引入的错误.

有没有像Python的十进制标准库?您可以推荐任何FOSS库吗?

问候

php fixed-point decimal

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

如何在chef LWRP定义中实现动态属性默认值

我希望能够定义一个轻量级资源,让我们说3个参数,其中两个是基本/基本参数,第三个是这两个参数的组合.我还想提供定制第三个参数的可能性.例如:

如何修改以下代码以实现full_name属性的上述行为:

资源定义:

actions :install

attribute :name, :kind_of => String, :name_attribute => true
attribute :version, :kind_of => String
attribute :full_name, :kind_of => String
Run Code Online (Sandbox Code Playgroud)

提供者定义:

action :install do
    Chef::Log.info "#{new_resource.full_name}"
end
Run Code Online (Sandbox Code Playgroud)

我想看到不同资源指令的不同输出,例如:

resource "abc" do
    version "1.0.1"
end
Run Code Online (Sandbox Code Playgroud)

会导致abc-1.0.1,但是:

resource "def" do
    version "0.1.3"
    full_name "completely_irrelevant"
end
Run Code Online (Sandbox Code Playgroud)

会导致completely_irrelevant.

是否有可能在资源定义中定义此行为(可能通过default参数),或者我只能在提供程序定义中执行此操作?如果第二个为真,那么我可以将计算出的值存储在new_resource对象的full_name属性中(该类似乎错过了full_name=方法定义)或者我必须将它存储在局部变量中吗?

更新

感谢Draco的提示,我意识到我可以在资源文件中创建一个访问器方法,并full_name在请求时动态计算值.我更喜欢更清洁的解决方案,但它比在行动实施中计算它要好得多.

厨师版 厨师:10.16.4

ruby chef-infra

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