我正在用python和sqlalchemy-0.7编写一个应用程序.它首先初始化sqlalchemy orm(使用声明),然后启动多线程Web服务器 - 我目前正在使用web.py进行快速原型设计,但将来可能会发生变化.我还将为预定作业添加其他"线程"等等,可能使用其他python线程.
从SA文档我明白我必须使用scoped_session()来获得线程本地会话,所以我的web.py应用程序最终应该看起来像:
import web
from myapp.model import Session # scoped_session(sessionmaker(bind=engine))
from myapp.model import This, That, AndSoOn
urls = blah...
app = web.application(urls, globals())
class index:
def GET(self):
s = Session()
# get stuff done
Session().remove()
return(stuff)
class foo:
def GET(self):
s = Session()
# get stuff done
Session().remove()
return(stuff)
Run Code Online (Sandbox Code Playgroud)
这是处理会话的正确方法吗?
据我所知,我应该在每个方法都得到一个scoped_session,因为它会给我一个我事先无法获得的线程本地会话(比如在模块级别).
此外,我应该在每个方法结束时调用.remove()或.commit()或类似的东西,否则会话仍将包含Persistent对象,我将无法查询/访问其他线程中的相同对象?
如果那个模式是正确的,那么通过只编写一次,也许使用装饰器可能会使它变得更好?这样的装饰器可以获取会话,调用方法然后确保正确地处理会话.如何将会话传递给装饰函数?
从float到Decimal的直接转换是在python-2.7中实现的,在Decimal的构造函数和Decimal.from_float()类方法中都是如此.
Python-2.6反而抛出一个TypeError建议首先转换为字符串:
TypeError: Cannot convert float to Decimal. First convert the float to a string
Run Code Online (Sandbox Code Playgroud)
所以我通常的解决方法是:
if sys.version_info < (2, 7):
Decimal.from_float = classmethod(lambda cls, x: cls(str(x)))
Run Code Online (Sandbox Code Playgroud)
这只是错误信息的文学翻译 - 我也不打算在构造函数中实现它.
如果它很简单,为什么他们不首先实现它而不是告诉用户在TypeError中执行它?这是最好的方法(扩展名是python-2.7和更新的?)
我正在使用Flask编写应用程序,我想为桌面和移动浏览器生成不同的代码.恕我直言,保持应用程序代码相同是一个好主意,并在模板级别推动在堆栈中提供不同内容的问题 - 所以它基本上成为为两个用例编写两组模板并找到方法的问题选择在每个请求中使用的正确的一个.我正在使用Flask的默认Jinja2模板引擎.
我应该提一下,我没有使用Flask的经验,而且我在编写代码时正在学习它 - 我也把它作为一个练习:)
您将使用什么机制来解决此问题并使源代码尽可能保持干净?
我正在研究的项目是一个包装为Python包的业务逻辑软件.这个想法是各种脚本或应用程序将导入它,初始化它,然后使用它.
它目前有一个顶级的init()方法,用于初始化和设置各种事物,一个很好的例子是它使用数据库连接设置SQLAlchemy并存储SA会话以供以后访问.它存储在我的项目的子包中(即myproj.model.Session,因此其他代码可以在导入模型后获得有效的SA会话).
长话短说,这使我的包装成为有状态的.我正在为项目编写单元测试,这种安全行为会带来一些问题:
我应该以某种方式重构我的包,因为当前的结构不是最好的(可能的)练习(tm)?:)
我应该把它留在那里,每次安装/拆除整件事吗?如果我要实现完全隔离,这意味着在每次测试中完全擦除并重新填充数据库,那不是太过分了吗?
这个问题实际上是关于整体代码和测试结构的,但是对于我的测试我使用nose-1.0的价值.我知道Isolate插件可能对我有所帮助,但我想在测试套件中做一些奇怪的事情之前得到正确的代码.
我需要egrep一个在运行时之前未知的字符串,我将通过shell变量获取(shell是bash,如果这很重要).问题是,该字符串将包含特殊字符,如大括号,空格,点,斜线等.
如果我知道字符串,我可以一次一个地逃避特殊字符,但是我怎么能为整个字符串做到这一点?
通过sed脚本运行字符串为每个特殊字符添加前缀可能是一个想法,我仍然需要rtfm应该如何编写这样的脚本.我不知道是否有其他更好的选择.
我确实阅读了,re_format(7)但似乎没有像"将整个下一个字符串视为文字"这样的事情......
编辑:为了避免误报,我还应该为模式添加换行检测,例如. egrep '^myunknownstring'
我有许多可变大小的列表,包含具有属性foo的相同类的实例,并且对于每个列表,我必须应用如下规则:
结合上述三个规则可能足以表达我将需要的任何类似约束.这就像软件包中的依赖检查,但我有数量和缺乏版本:)
一个天真的方法是:
R_CONFLICT={ A: [B,C,D] }
R_DEPENDS ={ X: [ [Y,Z], W, .. } # means: A depends on either Y or Z, and W
R_MIN ={BAR: n, BAZ: m}
R_MAX ={BAR: o, BAZ: p}
# now just loop over lists to check them..
Run Code Online (Sandbox Code Playgroud)
这是Constraint编程的问题吗?我实际上并不需要解决某些问题以获得结果,我需要针对某些约束验证我的列表并检查它们是否满意.您如何对此问题进行分类,您将如何解决?
为了它的价值,我用Python编写代码,但我欢迎通用的编程答案:)如果事实证明我必须深入研究约束编程,我可能会从尝试python-constraint开始.
我有一个或多个(不可变的,可散列的)对象的无序序列,可能有重复,我想得到所有这些对象的排序序列,没有重复.
现在我正在使用一个集合来快速收集所有丢弃重复项的元素,将其转换为列表然后对其进行排序:
result = set()
for s in sequences:
result = result.union(s)
result = list(result)
result.sort()
return result
Run Code Online (Sandbox Code Playgroud)
它有效,但我不会称之为"漂亮".有没有更好的办法?
我在sqlalchemy-0.7中有一个带有Date列的类。我可以使用column_property或类似的东西来获取年份并让我轻松地对其进行过滤吗?我怎么写呢?
IE,我想拥有(声明性语法):
class Foo(Base):
id = Column(Integer, primary_key=True)
date = Column(Date(), nullable=False)
year = column_property(something here)
# later on
q = session().query(Foo).filter_by(year=2011)
Run Code Online (Sandbox Code Playgroud) Pebble应用程序(在手表上运行)可以直接访问互联网(例如,从HTTP REST API获取数据)使用配对的手机仅作为网络网关,而无需编写专用的应用程序或软件支持来运行通话中?
python ×7
sqlalchemy ×2
bash ×1
constraints ×1
decimal ×1
declarative ×1
flask ×1
grep ×1
jinja2 ×1
list ×1
pebble-watch ×1
properties ×1
scripting ×1
session ×1
state ×1
unit-testing ×1