小编Dan*_*ank的帖子

如何优雅地检查对象/实例/变量的存在,并同时将其分配给变量(如果它存在于python中)?

我正在使用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,而且针对每个等效场景.

闭上眼睛打"发布你的问题"并等待聪明的人和蟒蛇人用心去追捕我,因为他们可能会说些不合适的东西 ;-)

python sqlalchemy

66
推荐指数
4
解决办法
6万
查看次数

为什么`git diff`没有调用外部差异工具?

在我的存储库中,如果我输入

$ 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)

注意 …

git diff meld

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

numpy - 评估点网格上的函数

生成包含在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上以各种形式提出,但我找不到简明扼要的问答.我发布了这个提供简洁的简单解决方案(如下).

python arrays numpy

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

我们如何调用正常的函数来预期协程?

考虑一个调用另一个协程的协程:

async def foo(bar):
     result = await bar()
     return result
Run Code Online (Sandbox Code Playgroud)

如果bar是协程,这可以正常工作.我需要做什么(即我需要将调用包装起来bar),以便这个代码在bar正常函数中做正确的事情?

async def即使它从不做任何异步(即从不使用await),也完全有可能定义一个协同程序.但是,问题是如何bar在代码中包装/修改/调用常规函数foo,bar以便等待.

python concurrency python-asyncio

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

我在哪里可以找到释放GIL的numpy函数列表?

我发现了几个SO问题以这种或那种方式询问这个问题,但它们实际上都没有给出一个列表或者引用一个列表.

这个问题指的是一个wiki页面,但在wiki页面会谈有关的GIL和多线程,它不会给的GIL释放功能的列表.

这个邮件列表帖子表明找出的唯一方法是阅读numpy源.真?

python numpy gil

9
推荐指数
1
解决办法
868
查看次数

根据行中的其他值更新列

请考虑下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各得一分.

后来我们增加两列winnerloser,两者相同的数据类型为name_Aname_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)

mysql

9
推荐指数
2
解决办法
4817
查看次数

在Flask/WTForms中创建具有不同数量的重复子表单的表单

我的模型目前有三个相关的对象(还有更多,但只有三个与此问题相关).用户,网络和电子邮件.我希望能够做的是拥有一组定义的网络,并允许每个用户在每个网络上都有一个电子邮件地址(这些稍微复杂一点,但我已将它们减少到我认为相关的内容) .

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)

python flask flask-wtforms

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

告诉IPython使用对象的`__str __而不是`__repr__`来输出

默认情况下,当IPython显示一个对象时,它似乎正在使用__repr__.

__repr__在给定合适的环境的情况下,应该生成一个可用于重建对象的唯一字符串.这不同于__str__,它应该产生人类可读的输出.

现在假设我们已经编写了一个特定的类,我们希望IPython默认生成人类可读的输出(即没有显式调用print__str__).我们不希望通过使我们的类的捏造它__repr____str__的工作.这将破坏规则.

有没有办法告诉IPython __str__默认为特定类调用?

repr ipython

6
推荐指数
1
解决办法
1018
查看次数

在不可用的类中使用描述符 - python

使用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 descriptor

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

如果__new__没有返回cls的实例,python不会调用__init__这个事实的设计原因是什么?

关于为什么python __init__在创建对象后并不总是调用的问题有很多问题.当然,答案可以在文档的摘录中找到:

如果__new__()返回一个实例cls,那么__init__()将调用新实例的方法__init__(self[, ...]),其中self是新实例,其余参数与传递给它的相同__new__().

如果__new__()没有返回实例cls,则__init__()不会调用新实例的方法.

这个的设计原因是什么?

python

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

numpy数组的和行,其中每个和的起始索引来自另一个数组

我有一个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方式吗?

python numpy

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

为什么itemAt()并不总能找到QGraphicsItem

考虑这个非常简单的示例,您可以在QGraphicsScene周围拖动一个方块(使用PyQt,C++用户读取selfthis)

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.

这是怎么回事?

python qt pyqt pyqt4

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