小编Ana*_*ory的帖子

有向图节点:跟踪后继者和前任者

我试图Node在有向图中实现一个表示节点的类,特别是有一组后继者和前辈.我希望Node.predecessors并且Node.predecessors表现得像集合,特别是我想迭代它们的元素,添加和删除元素,检查包含,并从迭代中设置它们.但是,node_1.sucessors.add(node_2)它之后应该是真的node_1 in node_2.pedecessors.

似乎有可能编写一个set实现这种魔法的新子类,但据我所知,这样一个类的实现会非常麻烦,因为它必须知道Node它所属的对象以及它是否是前身或者后继并且需要一些特殊的方法来添加等等,这样node_1.sucessors.add(node_2)就不会调用node_2.predecessors.add(node_1)因而导致无限循环.

(node for node in all_nodes if self in node.sucessors)应该可以动态生成两个属性中的一个属性,但是我需要跟踪属于图形的所有节点,如果我只有一个图形,但是使用一个,这很容易(将其添加到weakref.WeakSet类属性中__init__)如果我有多个不相交的图,那么所有节点的大集合会导致大量的计算工作,而我看不到如何修改前辈集.

有人有一个很好的解决方案吗?

python directed-graph

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

相对寻找python3中的io.StringIO

我正在尝试重构python 2包以与python-3.x一起使用.该包使用StringIO.StringIOpython 2,并使用对象的相对搜索方法,语句如flob.seek(-1, 1).不幸的是,python 3中seek相应io.StringIO对象的方法不支持相对搜索,因此代码提出

OSError: Can't do nonzero cur-relative seeks
Run Code Online (Sandbox Code Playgroud)

在尝试执行该语句时.

重构包含这些调用的模块的最佳方法是什么,因为我希望能够继续使用此文件对象以及(从中派生的对象)出现的函数?

python stringio python-3.x

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

如何使用用户栏进行交易?

我得到了使用 sqlalchemy-continuum 的建议,它似乎可以立即完成我想要的功能。

\n\n

默认情况下,ORM 假定存在一个用户列。我确实想保存编辑的发起者,但是文档只说\xe2\x80\x9c这是指定用户类\xe2\x80\x9d的方式,而没有说明实际使用版本化时如何指定此类对象表。

\n\n

如何指定负责事务的用户?\n是否有类似的方法向每个事务添加提交消息/原因/引用(VARCHAR)?

\n

sqlalchemy-continuum

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

如何复制而不是深度复制 networkx 图?

我想将函数调用之前的networkx.Graph对象状态(有副作用)与之后的状态进行比较。nd(n)

有可变对象节点属性n.node[0]['attribute'],例如我想比较的。

明显地,

before = n
d()
after = n
assert id(before.node[0]['attribute']) == id(after.node[0]['attribute'])
Run Code Online (Sandbox Code Playgroud)

取得了微不足道的成功,因为

before == after
Run Code Online (Sandbox Code Playgroud)

但如果我设置before=n.copy(),则会进行深层复制,因此id(before.node[0]['attribute']) != id(after.node[0]['attribute']). 如何在不复制所有节点属性对象的情况下获取 Graph 对象的副本?

deep-copy networkx

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

python表查找:元组与数据库的列表

在python中,我正在开发一个项目,该项目经常涉及计算具有某些给定属性的对象有多少匹配特定条件.我可以看到如何使用元组或对象或数据库的列表来执行此操作,但我想知道以这种方式过滤对象列表是"明显的pythonic"方法.

我想到的选项看起来像这样:

list_of_all = [object_type(property0, property1, ...), ...]
number_of_matches = len(filter(object_type.property2_test(property2),
    filter(object_type.property1_getter, list_of_all)

list_of_all = [object_type(property0, property1, ...), ...]
number_of_matches = len([0 for candidate in list_of_all
    if candidate.property1 and candidate.property2 == property2])

list_of_all = [(property0, property1, ...), ...]
number_of_matches = len([0 for candidate in list_of_all
    if candidate[1] and candidate[2] == property2])

db_cursor.execute("""CREATE TABLE table_of_all
    (property0 INTEGER, property1 INTEGER, ...)""")
number_of_matches = len(db_cursor.execute("""SELECT 1 FROM table_of_all
    WHERE property1 = 1 AND property2 = ?""", (property2,)).fetchall())
Run Code Online (Sandbox Code Playgroud)

在我的代码的上下文中使用最后两个,timeit告诉我,存在如此显着的差异.

$ python -m timeit -n …
Run Code Online (Sandbox Code Playgroud)

python database

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

从命令行获取参数,然后从文件获取参数,然后从默认值获取

我有一个python程序,它运行取决于一些参数.比方说,其中一个参数C的默认值为3.因此,当我在没有任何参数的情况下运行它时,它会

$ python parsing.py
C=3
Run Code Online (Sandbox Code Playgroud)

当我为初始数据加载文件时,它可以从该文件中获取一些参数值.例如,如果我的文件MakeC5说程序应该运行C=5,我会得到

$ python parsing.py --file=MakeC5
C=5
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我将C的不同值指定为可选参数,则采用该值,并且优先于文件中的值.

$ python parsing.py --C=4
C=4

$ python parsing.py --file=MakeC5 --C=4
C=4
Run Code Online (Sandbox Code Playgroud)

到这里,我可以检查命令行上指定的值是否与默认值不同,否则从文件中取出一个,如同

if parameters.C == parser.get_default('C'):
    parameters.C = load_file(parameters.file)["C"]
Run Code Online (Sandbox Code Playgroud)

但是,如果我在命令行中给出C的默认值,则此方法不起作用

$ python parsing.py --file=MakeC5 --C=3
C=3
Run Code Online (Sandbox Code Playgroud)

我该如何处理这个案子呢?有没有一种方法不需要像在中那样解析命令行两次

parameters = parser.parse_args()
parameters_from_file = load_file(parameters.file)
parser.set_defaults(**parameters_from_file)
parameters = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

对我来说这看起来不像"明显的pythonic方式"吗?这是准读取可以指定为参数的配置文件,所以我希望有一个好方法.

python argparse

0
推荐指数
1
解决办法
921
查看次数