有没有办法在Python中创建类级别的只读属性?例如,如果我有课Foo,我想说:
x = Foo.CLASS_PROPERTY
Run Code Online (Sandbox Code Playgroud)
但是阻止任何人说:
Foo.CLASS_PROPERTY = y
Run Code Online (Sandbox Code Playgroud)
编辑: 我喜欢Alex Martelli解决方案的简单性,但不喜欢它需要的语法.他和~ututbu的答案都启发了以下解决方案,这更接近我所寻找的精神:
class const_value (object):
def __init__(self, value):
self.__value = value
def make_property(self):
return property(lambda cls: self.__value)
class ROType(type):
def __new__(mcl,classname,bases,classdict):
class UniqeROType (mcl):
pass
for attr, value in classdict.items():
if isinstance(value, const_value):
setattr(UniqeROType, attr, value.make_property())
classdict[attr] = value.make_property()
return type.__new__(UniqeROType,classname,bases,classdict)
class Foo(object):
__metaclass__=ROType
BAR = const_value(1)
BAZ = 2
class Bit(object):
__metaclass__=ROType
BOO = const_value(3)
BAN = 4
Run Code Online (Sandbox Code Playgroud)
现在,我得到:
Foo.BAR …Run Code Online (Sandbox Code Playgroud) 我正在使用Apache HttpComponents库连接到我的AppEngine应用程序.为了验证我的用户身份,我需要将身份验证令牌传递给应用程序的登录地址(http://myapp.appspot.com/_ah/login?auth= ..)并从头部抓取一个cookie.响应.但是,登录页面以重定向状态代码响应,我不知道如何阻止HttpClient跟踪重定向,从而阻止我拦截cookie.
Fwiw,我用来发送请求的实际方法如下.
private void execute(HttpClient client, HttpRequestBase method) {
// Set up an error handler
BasicHttpResponse errorResponse = new BasicHttpResponse(
new ProtocolVersion("HTTP_ERROR", 1, 1), 500, "ERROR");
try {
// Call HttpClient execute
client.execute(method, this.responseHandler);
} catch (Exception e) {
errorResponse.setReasonPhrase(e.getMessage());
try {
this.responseHandler.handleResponse(errorResponse);
} catch (Exception ex) {
// log and/or handle
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何阻止客户端跟踪重定向?
谢谢.
更新:
根据下面的解决方案,我在创建一个DefaultHttpClient client(并在将其传递给execute方法之前)之后执行了以下操作:
if (!this.followRedirect) {
client.setRedirectHandler(new RedirectHandler() {
public URI getLocationURI(HttpResponse response,
HttpContext …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来检查给定函数在Python中使用的参数数量.目的是实现一种更健壮的方法来修补我的类以进行测试.所以,我想做这样的事情:
class MyClass (object):
def my_function(self, arg1, arg2):
result = ... # Something complicated
return result
def patch(object, func_name, replacement_func):
import new
orig_func = getattr(object, func_name)
replacement_func = new.instancemethod(replacement_func,
object, object.__class__)
# ...
# Verify that orig_func and replacement_func have the
# same signature. If not, raise an error.
# ...
setattr(object, func_name, replacement_func)
my_patched_object = MyClass()
patch(my_patched_object, "my_function", lambda self, arg1: "dummy result")
# The above line should raise an error!
Run Code Online (Sandbox Code Playgroud)
谢谢.
对于Heroku上的我的(Django)项目,我将requirements.txt文件中的一个依赖项更新为更新版本,现在我希望Heroku升级已安装的版本.我试过了:
heroku run "pip install -r requirements.txt --upgrade -E ."
Run Code Online (Sandbox Code Playgroud)
哪个将正确的输出吐出到终端,但显然实际上没有升级任何东西; 当我跑:
heroku run "pip freeze -E ."
Run Code Online (Sandbox Code Playgroud)
所有软件包版本都是相同的.我甚至尝试删除包,但也没有用.如何强制在Heroku上的Python项目中升级依赖项?
......并不是说我对开罗有什么 - 我其实很喜欢它.安装Python绑定非常困难,特别是在Mac上(参见有关在OS X上安装pycairo的所有SO问题).还有更好的选择吗?
编辑:
对于更多的上下文,我正在创建一个我希望易于部署的Web服务,理想情况下使用标准安装通道; 无法在许多部署平台上简单地使用pip或easy_install引入复杂性到部署过程中.此外,我希望任何人都可以轻松地设置虚拟环境并在本地计算机上对应用程序进行开发.同样,易于安装是重要的一点.
我试图从函数中访问Oracle元数据表中的信息.例如(有目的地简化):
CREATE OR REPLACE PROCEDURE MyProcedure
IS
users_datafile_path VARCHAR2(100);
BEGIN
SELECT file_name INTO users_datafile_path
FROM dba_data_files
WHERE tablespace_name='USERS'
AND rownum=1;
END MyProcedure;
/
Run Code Online (Sandbox Code Playgroud)
当我尝试在sqlplus进程中执行此命令时,我收到以下错误:
LINE/COL ERROR
-------- -----------------------------------------------------------------
5/5 PL/SQL: SQL Statement ignored
6/12 PL/SQL: ORA-00942: table or view does not exist
Run Code Online (Sandbox Code Playgroud)
我知道用户可以访问该表,因为当我从同一个sqlplus进程执行以下命令时,它会显示预期的信息:
SELECT file_name
FROM dba_data_files
WHERE tablespace_name='USERS'
AND rownum=1;
Run Code Online (Sandbox Code Playgroud)
结果如下:
FILE_NAME
--------------------------------------------------------------------------------
/usr/lib/oracle/xe/oradata/XE/users.dbf
Run Code Online (Sandbox Code Playgroud)
有什么我需要做的不同吗?
我已经成为像 RSpec 和 Jasmine 这样的嵌套测试用例上下文的粉丝,我想知道是否有任何 Nose 插件实现了一个测试查找器,允许您将类作为上下文嵌套。结果测试将类似于以下内容:
from nose.tools import *
from mysystem import system_state
class TestMySystem (TestCase):
def setUp(self):
system_state.initialize()
class WhenItIsSetTo1 (TestCase):
def setUp(self):
system_state.set_to(1)
def test_system_should_be_1 (self):
assert_equal(system_state.value(), 1)
class WhenItIsSetTo2 (TestCase):
def setUp(self):
system_state.set_to(2)
def test_system_should_be_2 (self):
assert_equal(system_state.value(), 2)
Run Code Online (Sandbox Code Playgroud)
在上面的假设情况下,system_state.initialize()会在每次测试之前调用。我知道有 PyVows 可以做这样的事情,它看起来不错,但我正在寻找一些东西来插入我当前的项目,该项目已经有许多单元测试/鼻子风格的测试。