我正在使用SQLAlchemy来填充数据库,我经常需要在处理之前检查数据库中是否存在orm对象.这可能是一个非传统的问题,但我发现自己经常遇到这种模式:
my_object = session.query(SomeObject).filter(some_fiter).first()
if my_object: # Mostly in databases...
# Juchee it exists
# process
else:
# It does not exist. :-(
my_object = SomeObject()
# process
Run Code Online (Sandbox Code Playgroud)
我梦想的是:
if my_object = session.query(someObject).blabla.first():
# if my_object is None this scope is left alone
# if my_object is not None I can work with my_object here...
Run Code Online (Sandbox Code Playgroud)
我知道,这种语法是错误的,但我想解释一下,我的意思是这个例子.任何等效的方式都会让我开心.
这种模式有一种优雅的python方法吗?这个问题不仅针对SQLAlchemy,而且针对每个等效场景.
闭上眼睛打"发布你的问题"并等待聪明的人和蟒蛇人用心去追捕我,因为他们可能会说些不合适的东西 ;-)
在我的存储库中,如果我输入
$ git diff some-file
Run Code Online (Sandbox Code Playgroud)
要么
$ git difftool some-file
Run Code Online (Sandbox Code Playgroud)
我得到了终端差异显示.我认为这不应该发生,因为我已经设置了一个外部差异工具,如输出所示git config -l:
$ git config -l
user.name=blah blah
user.email=blah blah
http.sslverify=true
diff.external=/home/daniel/bin/git-diff <--This is the important line
push.default=simple
core.filemode=false
core.editor=gedit
alias.tree=log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)
%C(black)[%cr]%C(reset) %x09%C(black)%an: %s %C(reset)'
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.url=https://daniel@skynet/git/pyle.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.daniel.remote=origin
branch.daniel.merge=refs/heads/daniel
Run Code Online (Sandbox Code Playgroud)
该diff.external行中引用的git-diff文件如下所示
#!/bin/bash
meld $2 $5
Run Code Online (Sandbox Code Playgroud)
为什么不git diff援引融合?
如果我设置git config -l了以下行,我会得到相同的行为:
diff.tool = meld
Run Code Online (Sandbox Code Playgroud)
要么
diff.external = usr/bin/meld
Run Code Online (Sandbox Code Playgroud)
注意 …
生成包含在n维点网格上评估的函数值的numpy数组有什么好方法?
例如,假设我想评估由其定义的函数
def func(x, y):
return <some function of x and y>
Run Code Online (Sandbox Code Playgroud)
假设我想在二维点阵列上对它进行评估,其中x值从10到4分为10步,y值从-1到1分为20步.在numpy中这样做的好方法是什么?
PS这已经多次在StackOverflow上以各种形式提出,但我找不到简明扼要的问答.我发布了这个提供简洁的简单解决方案(如下).
考虑一个调用另一个协程的协程:
async def foo(bar):
result = await bar()
return result
Run Code Online (Sandbox Code Playgroud)
如果bar是协程,这可以正常工作.我需要做什么(即我需要将调用包装起来bar),以便这个代码在bar正常函数中做正确的事情?
async def即使它从不做任何异步(即从不使用await),也完全有可能定义一个协同程序.但是,问题是如何bar在代码中包装/修改/调用常规函数foo,bar以便等待.
请考虑下trials表:
CREATE TABLE trials
(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name_A VARCHAR(6),
name_B VARCHAR(6),
score_A INT,
score_B INT);
Run Code Online (Sandbox Code Playgroud)
抽象地说,这代表了一系列试验,其中尝试了两种可能的东西,A和B. A和B各得一分.
后来我们增加两列winner和loser,两者相同的数据类型为name_A和name_B:
ALTER TABLE trials
ADD COLUMN winner VARCHAR(6),
ADD COLUMN loser VARCHAR(6);
Run Code Online (Sandbox Code Playgroud)
对于每个试验,我们希望填写winner与较高分数对应的任何名称.
例如,如果试用了
???????????????????????????????????????
? name_A ? name_B ? score_A ? score_B ?
???????????????????????????????????????
? alice ? bob ? 10 ? 5 ?
???????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
那个试验winner应该是alice.同样,在这种情况下loser应该填充bob:
????????????????????????????????????????????????????????
? …Run Code Online (Sandbox Code Playgroud) 我的模型目前有三个相关的对象(还有更多,但只有三个与此问题相关).用户,网络和电子邮件.我希望能够做的是拥有一组定义的网络,并允许每个用户在每个网络上都有一个电子邮件地址(这些稍微复杂一点,但我已将它们减少到我认为相关的内容) .
class User(UserMixin, db.Model):
"""
The User object.
"""
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
# email = db.Column(db.String(64), unique=True, index=True)
username = db.Column(db.String(64), unique=True, index=True)
password_hash = db.Column(db.String(128))
firstname = db.Column(db.String(64))
lastname = db.Column(db.String(64), unique=False, index=True)
email = db.relationship('Email', backref='user')
class Network(db.Model):
__tablename__ = 'networks'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), index=True)
emails = db.relationship('Email', backref='network', lazy='dynamic')
class Email(db.Model):
__tablename__ = 'emails'
id = db.Column(db.Integer, primary_key=True)
network_id = db.Column(db.Integer, db.ForeignKey('networks.id'))
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
address = …Run Code Online (Sandbox Code Playgroud) 默认情况下,当IPython显示一个对象时,它似乎正在使用__repr__.
__repr__在给定合适的环境的情况下,应该生成一个可用于重建对象的唯一字符串.这不同于__str__,它应该产生人类可读的输出.
现在假设我们已经编写了一个特定的类,我们希望IPython默认生成人类可读的输出(即没有显式调用print或__str__).我们不希望通过使我们的类的捏造它__repr__做__str__的工作.这将破坏规则.
有没有办法告诉IPython __str__默认为特定类调用?
使用python描述符时的常见设计模式是使描述符使用该描述符保留实例字典.例如,假设我想创建一个计算访问次数的属性:
class CountingAttribute(object):
def __init__(self):
self.count = 0
self.value = None
class MyDescriptor(object):
def __init__(self):
self.instances = {} #instance -> CountingAttribute
def __get__(self, inst, cls):
if inst in self.instances:
ca = self.instances[inst]
else:
ca = CountingAttribute()
self.instances[inst] = ca
ca.count += 1
return ca
class Foo(object):
x = MyDescriptor()
def main():
f = Foo()
f.x
f.x
print("f.x has been accessed %d times (including the one in this print)"%(f.x.count,))
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
这是一个完全愚蠢的例子,没有做任何有用的事情; 我试图孤立主要观点.
问题是我不能在一个不可清除的类中使用这个描述符,因为该行
self.instances[inst] = ca
Run Code Online (Sandbox Code Playgroud)
使用实例作为字典键.处理这种情况有没有明智的方法?例如,一个人立即想要使用实例 …
关于为什么python __init__在创建对象后并不总是调用的问题有很多问题.当然,答案可以在文档的摘录中找到:
如果
__new__()返回一个实例cls,那么__init__()将调用新实例的方法__init__(self[, ...]),其中self是新实例,其余参数与传递给它的相同__new__().如果
__new__()没有返回实例cls,则__init__()不会调用新实例的方法.
这个的设计原因是什么?
我有一个NxM叫做numpy的数组data.我也有一个N名为的长度数组start_indices.我想要一个新的长度M数组,其中第i个元素是sum(data[i][start_indices[i]:]).
这是一种方法:
import numpy as np
data = np.linspace(0, 11, 12).reshape((3, 4))
data
array([[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11]])
start_indices = np.array([0, 1, 2])
sums = []
for start_index, row in zip(start_indices, data):
sums.append(np.sum(row[start_index:]))
sums = np.array(sums)
Run Code Online (Sandbox Code Playgroud)
有更多的numpythonic方式吗?
考虑这个非常简单的示例,您可以在QGraphicsScene周围拖动一个方块(使用PyQt,C++用户读取self为this)
import sys
from PyQt4 import QtGui, QtCore
class MainWindowUi(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.scene = Scene(0, 0, 300, 300, self)
self.view = QtGui.QGraphicsView()
self.setCentralWidget(self.view)
self.view.setScene(self.scene)
self.scene.addItem(Square(0,0,50,50))
class Scene(QtGui.QGraphicsScene):
def mousePressEvent(self, e):
self.currentItem = self.itemAt(e.pos())
print (self.currentItem)
QtGui.QGraphicsScene.mousePressEvent(self, e)
class Square(QtGui.QGraphicsRectItem):
def __init__(self, *args):
QtGui.QGraphicsRectItem.__init__(self, *args)
self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
win = MainWindowUi()
win.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
当您在场景中单击鼠标时,您应该看到一个打印语句,告诉您单击了正方形或没有任何东西(即无).如果您只是启动程序并单击正方形,则此方法有效.
现在将方块拖离左上角并再次单击它.即使单击正方形,此时itemAt()也会返回None.
这是怎么回事?