小编phi*_*686的帖子

python中的成语:闭包与仿函数对象

所以我对更有经验的python程序员对以下样式问题的看法感到好奇.假设我正在构建一个函数,该函数将通过pandas数据框或任何类似的用例逐行迭代,其中函数需要访问其先前的状态.似乎至少有四种方法可以在python中实现它:

1)关闭:

def outer():
    previous_state = None
    def inner(current_state) :
        nonlocal previous_state
        #do something
        previous_state=current_state
        return something
Run Code Online (Sandbox Code Playgroud)

因此,如果你来自javascript背景,这对你来说无疑是显而易见的.在python中感觉很自然,直到你需要访问封闭的范围,当你最终会做类似的事情inner.__code__.co_freevars,它会给你封闭变量的名称作为元组,并找到你的索引想要,然后去inner.__closure__[index].cell_contents获得它的价值.不完全优雅,但我认为重点往往是隐藏范围,所以它应该很难达到.另一方面,与OOP语言相比,当几乎所有其他方式都拥有私有变量时,python使封闭函数变为私有也感觉有点奇怪.

2)Fu​​nctor

def outer():
    def inner(current_state):
        #do something
        inner.previous_state=current_state
        return something
    ret = inner
    ret.previous_state=None
    return ret
Run Code Online (Sandbox Code Playgroud)

这"打开了封闭",现在封闭状态作为函数的属性完全可见.这是有效的,因为函数实际上只是伪装的对象.我倾向于这是最pythonic.它清晰,简洁,易读.

3)对象这可能是OOP程序员最熟悉的

class Calculator(Object) :
    def __init__(self):
        self.previous_state=None

    def do_something(self, current_state) :
        #do_something
        self.previous_state = current_state
        return something
Run Code Online (Sandbox Code Playgroud)

这里最大的问题是你最终会得到很多类定义.这对于像Java这样的完全OOP语言来说很好,你可以使用接口等来管理它,但是在一个简化的语言中,有许多简单的类只是为了携带需要一些状态的函数,这似乎有点奇怪.

4)全局 - 我不会证明这一点,因为我特别想避免污染全局名称空间

5)装饰器 - 这是一个有点曲线球,但你可以使用装饰器来存储部分状态信息.

@outer
def inner(previous_state, current_state):
    #do something
    return something

def outer(inner) :
    def wrapper(current_state) :
        result =  inner(wrapper.previous_state, …
Run Code Online (Sandbox Code Playgroud)

python

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

在multiprocessing.Queue中更改缓冲区大小

所以我有一个生产者和消费者的系统通过无限大小的队列连接,但如果消费者反复调用get直到抛出Empty异常,它就不会清除队列.

我相信这是因为一旦套接字缓冲区已满,消费者端队列中将对象序列化到套接字中的线程就会被阻塞,因此它会一直等到缓冲区有空间,但是,对于消费者来说这是可能的调用get"太快",所以它认为队列是空的,实际上另一侧的线程有更多的数据要发送,但是不能足够快地序列化它以防止套接字对消费者显得空洞.

我相信如果我可以更改底层套接字上的缓冲区大小(我是基于Windows的),这个问题会得到缓解.据我所知,我需要做的是:

import multiprocessing.connections as conns
conns.BUFSIZE = 2 ** 16 # is typically set as 2 ** 13 for windows
import multiprocessing.Queue as q
Run Code Online (Sandbox Code Playgroud)

如果我执行上述操作,是否意味着当多重处理初始化队列时,它将使用我已在我已导入的multiprocessing.connections版本中设置的新缓冲区大小?那是对的吗?

另外我相信这只会影响windows,因为BUFSIZE不会在linux机器上使用,因为它们的所有套接字默认设置为60千字节?

有人曾尝试过这个吗?这会对窗户产生副作用吗?Windows上的套接字缓冲区大小有哪些基本限制?

===================一个代码示例来演示===================

# import multiprocessing.connection as conn
# conn.BUFSIZE = 2 ** 19
import sys
import multiprocessing as mp
from Queue import Empty
from time import sleep

total_length = 10**8

def supplier(q):
    print "Starting feeder"
    for i in range(total_length) :
        q.put(i)


if __name__=="__main__":

    queue = mp.Queue()

    p = mp.Process(target=supplier, args=(queue,))

    p.start()

    sleep(120) …
Run Code Online (Sandbox Code Playgroud)

python python-2.7 python-multiprocessing

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

在python中清空multiprocessing.queue(-1)的首选方法

我想拉出当前队列中的所有项目.还有另一个线程不断地将项目放在另一端,每个时期我想要获取当前队列中的所有项目.

有什么理由可以选择:

res = []
while q.qsize > 0 :
    res.append(q.get())
Run Code Online (Sandbox Code Playgroud)

要么

res = []
while True :
    try :
         res.append(q.get(block=False)) 
    except Queue.Empty :
         break
Run Code Online (Sandbox Code Playgroud)

现在文档明确指出qsize()> 0不会阻止队列在get上阻塞,但只有在多个线程可以从输出获取的情况下才是这样吗?

队列.qsize()返回队列的大致大小.注意,qsize()> 0不保证后续的get()不会阻塞,qsize()<maxsize也不保证put()不会阻塞.

这是否意味着第二种形式应该始终是首选?EAFP和所有这些?另外,调用q.qsize()有任何成本吗?是否会阻塞队列的另一端以便计算?

我想我已经谈过使用第二种形式,但对我来说似乎不那么干净.

python queue multiprocessing multiprocess python-multiprocessing

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

何时返回Iterable <String>而不是List,Set,Collection?

所以我一直在使用Neo4j API进行相当广泛的工作,我注意到它们几乎总是会有返回的功能

Iterable<Class>
Run Code Online (Sandbox Code Playgroud)

虽然我一直都明白,除非有令人信服的理由不这样做,否则最好退回Set,List或Collection中的一个.设置为向用户指示它永远不会有重复的元素,当订单重要时列出或包含重复项,或者当您没有策略时收集.

我更喜欢这些Iterable,因为它们有有用的实用程序,如.contains(),.add()等.我发现我经常需要编写代码来将Iterable转换为Collection.

所以我的问题是:我错过了一些重要的东西吗?是否有合理的理由使用Iterable而不是Collection?你什么时候这样做?显然,Neo4j的人似乎是一流的程序员,所以我认为他们有这个原因,但我看不到它.

java neo4j

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

写入Excel时“未散布”熊猫多索引

我有一个带有多个索引的pandas数据框,默认情况下,在打印到屏幕时,它将“稀疏”输出,以便不再重复较高级别的索引。例如:

疏:

在此处输入图片说明

我可以将其更改为“ unsparse”,如下所示: 在此处输入图片说明

但是,df.to_excel(writer)不支持此选项,因为它将始终将索引写入为具有合并单元格的稀疏目录。有什么方法可以使这种编写以“不稀疏”的方式表现出色?另外,我可以写一个csv并将其导入excel,因为csv总是“不稀疏”,但这有点烦人。

python excel pandas

4
推荐指数
2
解决办法
1582
查看次数

嵌入式neo4j中的节点引用相等是否得到保证?

我使用嵌入式图形数据库作为Java应用程序的一部分.假设我执行某种类型的密码查询,并返回包含节点集合的ExecutionResult.

可以假设这些节点形成连接图.

这些节点中的每一个都有一些关系,我可以使用node.getRelationships(Direction.OUTGOING)来访问这些关系.我的问题是,如果其中一个关系的目标已经出现在执行结果中(即关系是查询模板的一部分),它是否保证Relationship.getEndPoint == Node X.

我想我真正要问的是,当Neo4j中的事务返回一个节点时,它只返回一个对象,并且不同的查询将继续返回对该一个对象的引用,或者它是否继续生成碰巧的新对象请参考相同的数据点?由于Node没有覆盖equalsTo方法,我一直在假设前者,但我希望有人可以告诉我.

neo4j node-neo4j

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

Java的比较合同

它在Comparator接口的合同中说,它必须与equals一致.

如果equalsTo = true,这是否意味着Comparator = 0,或者当且仅当 equalsTo = true时,它是否意味着Comparator = 0 ?

我似乎记得它是第二个,但是我遇到了许多按非唯一子属性排序的比较器.

例如,我可能有对象具有子属性日期,我想按提交日期对对象列表进行排序.但是,您可以使用相同日期的多个对象?这有什么后果?当然这个问题已经有了最佳实践解决方案吗?如何在没有违反比较合同的情况下对属性进行排序,并且不保证是唯一的?这种违规行为会带来什么后果?他们可以管理吗?

java collections comparator

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

Jboss-CLI 无法从远程连接

我一直在尝试使用maven设置ear的远程部署,但是失败了,因为jboss-cli.bat脚本无法连接到服务器。它因堆栈跟踪而失败:

C:\Users\pstephens\Programming\jboss-eap-6.2\jboss-eap-6.2\bin>jboss-cli.bat --controller=172.22.2.29:9999 --connect --user=pstephens --password=#######
org.jboss.as.cli.CliInitializationException: Failed to connect to the controller
    at org.jboss.as.cli.impl.CliLauncher.initCommandContext(CliLauncher.java:284)
    at org.jboss.as.cli.impl.CliLauncher.main(CliLauncher.java:262)
    at org.jboss.as.cli.CommandLineMain.main(CommandLineMain.java:34)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.jboss.modules.Module.run(Module.java:292)
    at org.jboss.modules.Main.main(Main.java:455)
Caused by: org.jboss.as.cli.CommandLineException: The controller is not available at 172.22.2.29:9990
    at org.jboss.as.cli.impl.CommandContextImpl.tryConnection(CommandContextImpl.java:969)
    at org.jboss.as.cli.impl.CommandContextImpl.connectController(CommandContextImpl.java:808)
    at org.jboss.as.cli.impl.CommandContextImpl.connectController(CommandContextImpl.java:784)
    at org.jboss.as.cli.impl.CliLauncher.initCommandContext(CliLauncher.java:282)
    ... 8 more
Caused by: java.io.IOException: java.net.ConnectException: JBAS012144: Could not connect to remote://172.22.2.29:9990. The connection timed out
    at org.jboss.as.controller.client.impl.AbstractModelControllerClient.executeForResult(AbstractModelControllerClient.java:129)
    at org.jboss.as.controller.client.impl.AbstractModelControllerClient.execute(AbstractModelControllerClient.java:71)
    at org.jboss.as.cli.impl.CommandContextImpl.tryConnection(CommandContextImpl.java:947)
    ... 11 more
Caused by: java.net.ConnectException: JBAS012144: …
Run Code Online (Sandbox Code Playgroud)

java jboss jboss6.x

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