小编Sco*_*ott的帖子

让kwargs从封闭范围中获取

Python似乎是从类方法的封闭范围推断出一些kwargs,我不确定为什么.我正在实施一个Trie:

class TrieNode(object):
  def __init__(self, value = None, children = {}):
    self.children = children
    self.value = value

  def __getitem__(self, key):
    if key == "":
        return self.value
    return self.children[key[0]].__getitem__(key[1:])

  def __setitem__(self, key, value):
    if key == "":
        self.value = value
        return
    if key[0] not in self.children:
        self.children[key[0]] = TrieNode()
    self.children[key[0]].__setitem__(key[1:], value)
Run Code Online (Sandbox Code Playgroud)

在倒数第二行,我创建了一个新的TrieNode,可能是一个空的儿童字典.但是,当我检查结果数据结构时,树中的所有TrieNode都使用相同的子字典.即,如果我们这样做:

>>>test = TrieNode()
>>>test["pickle"] = 5
>>>test.children.keys()
['c', 'e', 'i', 'k', 'l', 'p']
Run Code Online (Sandbox Code Playgroud)

测试的子项应该只包含指向新TrieNode的"p".另一方面,如果我们进入该代码的倒数第二行并将其替换为:

        self.children[key[0]] = TrieNode(children = {})
Run Code Online (Sandbox Code Playgroud)

然后它按预期工作.不知怎的,然后,self.children字典被隐式地作为一个kwarg传递给TrieNode(),但为什么呢?

python dictionary trie

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

当subprocess.call收到终止信号时会发生什么?

信号会继续下去直到被调用的过程吗?

例如,我SIGINT向正在等待subprocess.call完成的python进程发出a 。 subprocess.call被打断了。子进程会怎样?怎么样SIGTERM,等等?

@zerkms指出,杀死父进程通常不会将终止信号传递给子进程。但是,很容易检查python subprocess.call函数是否发生了某些事情:

1号航站楼

$ python3
>>> import subprocess
>>> with open("foo.py", "w") as f:
...     f.write("import time; time.sleep(6000)")
... 
29
>>> subprocess.call(["python3", "foo.py"])
Run Code Online (Sandbox Code Playgroud)

2号航站楼

$ ps aux | grep foo.py
scott 3716  ........  20:03   0:00 python3 foo.py
scott 3720  ........  20:03   0:00 grep --color=auto foo.py
Run Code Online (Sandbox Code Playgroud)

1号航站楼

<Ctrl-C>
^CTraceback (most recent call last):
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/subprocess.py", line 289, in …
Run Code Online (Sandbox Code Playgroud)

python subprocess

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

为什么我不需要 java.base?

当我尝试 import 时javax.swing.JFrame,Eclipse 会抱怨,因为我需要明确告诉我的包我将从模块中导入内容java.desktop。所以我输入requires java.desktop了我的内容module-info.java,然后java编译器就知道如何链接这些java.desktop东西。我也可以把requires java.base我的module-info.java也放进去,但似乎没有必要。import java.util.Arrays没有它我也可以。

javacEclipse 是否在幕后为我的选择添加了一些魔法?javac自动需要吗java.base?为什么我不需要要求java.base?如果这是编译器的魔法,是否还有其他此类特权模块会自动链接到我的包中?

使用 jdk-14,但不确定这是否相关。

java eclipse

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

如何创建一个选择所有元素的切片对象?

我正在slice以编程方式构建s,并希望创建一个抓取"一切"的切片.我的直觉就是那个

my_slice = slice() 
Run Code Online (Sandbox Code Playgroud)

会产生一个这样的对象

assert (my_list[my_slice] == my_list) #True
Run Code Online (Sandbox Code Playgroud)

但是,快速查看文档会发现slice 需要一个stop参数.

我能得到一个对象all_slice,从而any_list[all_slice] == any_list为所有any_list

python

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

如何关闭 matplotlib 箭袋缩放?

matplotlib.pyplot.quiver函数采用一组“原点”点和一组“目的地”点,并绘制一堆从“原点”点开始朝“目的地”点方向的箭头。然而,有一个比例因子,因此箭头不一定在“目的地”点结束,它们只是指向那个方向。

例如

import matplotlib.pyplot as plt
import numpy as np

pts = np.array([[1, 2], [3, 4]])
end_pts = np.array([[2, 4], [6, 8]])

plt.quiver(pts[:,0], pts[:,1], end_pts[:,0], end_pts[:,1])
Run Code Online (Sandbox Code Playgroud)

图片

请注意,左下角的向量从 (1,2) 开始(我想要的),但不结束于 (2,4)。这是由使箭头变长或变短的函数scale参数控制的。quiver如何让箭头精确地结束于 (2,4)?

matplotlib

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

python语法错误* args和可选的arg

为什么这是语法错误?做这个事情的合适方法是什么?

>>> def f(*args, option=None):
  File "<stdin>", line 1
    def f(*args, option=None):
                      ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

python python-2.7

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

Flask SQLAlchemy 会话不同步

我有一个 Flask REST API,与 Gunicorn/nginx 堆栈一起运行。为 API 运行的每个线程设置一次全局 SQLAlchemy 会话。我设置了一个端点 /test/ 来运行 API 的单元测试。一项测试发出 POST 请求以将某些内容添加到数据库中,然后使用 finally: 子句进行清理:

def test_something():
    try:
        url = "http://myposturl"
        data = {"content" : "test post"}
        headers = {'content-type': 'application/json'}
        result = requests.post(url, json=data, headers=headers).json()
        validate(result, myschema)
    finally:
        db.sqlsession.query(MyTable).filter(MyTable.content == "test post").delete()
        db.sqlsession.commit()
Run Code Online (Sandbox Code Playgroud)

问题是,发出 POST 请求的线程现在在其会话中有一个“test post”对象,但数据库没有这样的对象,因为运行测试的线程从数据库中删除了该对象。因此,当我向服务器发出 GET 请求时,大约有四分之一的时间(我有 4 个 Gunicorn 工作人员)得到“测试帖子”对象,而四分之三的时间没有得到。这是因为每个线程都有自己的会话对象,并且它们不同步,但我真的不知道该怎么办......

这是我的 SQLAlchemy 会话的设置:

def connectSQLAlchemy():
    import sqlalchemy
    import sqlalchemy.orm
    engine = sqlalchemy.create_engine(connection_string(DBConfig.USER, DBConfig.PASSWORD, DBConfig.HOST, DBConfig.DB))
    session_factory = sqlalchemy.orm.sessionmaker(bind=engine)
    Session = sqlalchemy.orm.scoped_session(session_factory)
    return Session() …
Run Code Online (Sandbox Code Playgroud)

python session multithreading sqlalchemy gunicorn

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

如何创建一个不安全的jupyter服务器

Jupyter只允许从localhost访问,除非我做了一堆额外的安全措施.我正在运行我的服务器,因此它只能在本地网络上访问,任何有访问权限的人都可以信任localhost.如何设置没有额外安全功能的jupyter笔记本服务器?

jupyter jupyter-notebook

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

究竟什么是变量模板

我收到关于变量模板的c ++ 11警告.我不完全确定我需要它们,因为我不完全确定它们是什么. 我发现的参考文献在使用它之前不需要定义术语.我的直接想法是,它是一个尝试声明一个模板化类型的变量T,但这段代码编译得很好:

template <class T>
image<T> *image<T>::copy() const {
  image<T> *im = new image<T>(w, h, false);
  memcpy(im->data, data, w * h * sizeof(T));
  return im;
}
Run Code Online (Sandbox Code Playgroud)

什么是变量模板的完整定义,为什么它没有变量模板问题

c++ templates c++11 c++14

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

Java包命名合法语法规则

请注意,我不是在询问Java 包命名约定

例如,Java 在法律上不允许包名以数字开头

但是,官方 Java 文档似乎并未涵盖控制包名称中可以使用或不可以使用的内容的实际规则。

什么是合法的包名称集?

java

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