我试图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 2包以与python-3.x一起使用.该包使用StringIO.StringIO
python 2,并使用对象的相对搜索方法,语句如flob.seek(-1, 1)
.不幸的是,python 3中seek
相应io.StringIO
对象的方法不支持相对搜索,因此代码提出
OSError: Can't do nonzero cur-relative seeks
Run Code Online (Sandbox Code Playgroud)
在尝试执行该语句时.
重构包含这些调用的模块的最佳方法是什么,因为我希望能够继续使用此文件对象以及(从中派生的对象)出现的函数?
我得到了使用 sqlalchemy-continuum 的建议,它似乎可以立即完成我想要的功能。
\n\n默认情况下,ORM 假定存在一个用户列。我确实想保存编辑的发起者,但是文档只说\xe2\x80\x9c这是指定用户类\xe2\x80\x9d的方式,而没有说明实际使用版本化时如何指定此类对象表。
\n\n如何指定负责事务的用户?\n是否有类似的方法向每个事务添加提交消息/原因/引用(VARCHAR)?
\n我想将函数调用之前的networkx.Graph
对象状态(有副作用)与之后的状态进行比较。n
d(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 对象的副本?
在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程序,它运行取决于一些参数.比方说,其中一个参数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方式"吗?这是准读取可以指定为参数的配置文件,所以我希望有一个好方法.