小编VPf*_*PfB的帖子

如何从回溯中获取函数和模块名称?

我试图从回溯中提取信息,但出现错误。

我想删除call以下示例代码中的变量。我想搜索回溯并获取被调用的套接字模块函数的名称。我怎样才能做到这一点?

try:
    sock = None
    call = "socket"
    sock = socket.socket(family, stype)
    call = "setsockopt"
    set_my_options():
    call = "connect"
    sock.connect(addr)
except OSError as err:
    if sock is not None:
        sock.close()
    # call = name of the failed socket.XXX() call
    raise RPCError("{} failed".format(call))
Run Code Online (Sandbox Code Playgroud)

我尝试从(仅限Python3)开始:

stack = traceback.extract_stack(err.__traceback__)
Run Code Online (Sandbox Code Playgroud)

或(Python2 和 Python3)

stack = traceback.extract_stack(sys.exc_info()[2])
Run Code Online (Sandbox Code Playgroud)

但得到:

AttributeError:“traceback”对象没有属性“f_lineno”


编辑1

修复了被忽略的错误后,这就是我现在所拥有的:

    ....
except OSError as err:
    tb = traceback.extract_tb(err.__traceback__)
    for tb_entry in reversed(tb):
        if tb_entry[0] == __file__:
            failed = tb_entry[3]
            break …
Run Code Online (Sandbox Code Playgroud)

python

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

标准库中是否定义了标准输入,输出和错误描述符常量?

我在Python库中的任何地方都找不到这些基本常量.

STDIN = 0
STDOUT = 1
STDERR = 2
Run Code Online (Sandbox Code Playgroud)

这是微不足道的,但我简直无法相信我必须自己定义它们.

python

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

email.utils.parseaddr()现在是旧版API。我可以继续使用吗?

我花了一些时间阅读电子邮件库模块的文档。我们有一个新的API。现在将旧的API标记为legacy。

我只有一个小型电子邮件应用程序,我希望将其重写为仅使用新的更好的API不会很困难。但是我找不到简单email.utils.parseaddr()功能的简单替代品。他们说:

不需要直接将它们与新API一起使用,因为它们提供的解析和格式化是由新API的标头解析机制自动完成的。

email仅对于模块而言可能是正确的,但是我需要将RFC821样式的地址传递给smtplib期望为from_addr和的模块函数to_addrs。这些SMTP信封地址基本上是剥离的邮件头地址,parseaddr可以轻松创建它们:

smtp_addr = email.utils.parseaddr(email_addr)[1]
Run Code Online (Sandbox Code Playgroud)

新API中是否有相对简单的替代方法(我必须对此进行了监督)?如果不是,我是否希望“旧版” API保留在库中,或者将来会弃用?

注意:我知道smtplib可以从邮件标题中提取地址。我仍然喜欢明确地传递地址。

python

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

没有捕获asyncio.CancelledError

为什么CancelledError没有在这个例子中被捕获?

import asyncio

q = asyncio.Queue()

async def getter():
    try:
        v = await q.get()
        print(f"getter got {v}")
    except asyncio.CancelledError:
        print("getter cancelled")

async def test():
    task = asyncio.ensure_future(getter())
    task.cancel()
    await task

def main():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(test())

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

我想要获取"getter cancelled"消息,但收到了堆栈跟踪:

Traceback (most recent call last):
  File "ce.py", line 22, in 
    main()
  File "ce.py", line 19, in main
    loop.run_until_complete(test())
  File "/usr/lib64/python3.6/asyncio/base_events.py", line 468, in run_until_complete
    return future.result()
concurrent.futures._base.CancelledError

Task.cancel声明:

这将安排CancelledError通过事件循环在下一个循环中抛出到包装的协同程序中.然后协程有机会使用try/except/finally清理甚至拒绝请求.

python python-asyncio

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

请解释*elements,= iterable构造

从PEP448:

虽然*elements,= iterable导致元素成为列表,但元素=*可迭代,导致元素成为元组.造成这种情况的原因可能会让那些不熟悉这种结构的人感到困惑.

好吧,我就是其中一个人.我试了一下:

>>> *e, = range(3)
>>> e
[0, 1, 2]

>>> e = *range(3),
>>> e
(0, 1, 2)
Run Code Online (Sandbox Code Playgroud)

前者适用于Python 3.4和3.5.

后者仅在3.5.这是上述PEP448引入的新功能.它在PEP中描述,没有问题.

但是,我以前从未见过*elements, = iterable.你能解释它是如何工作的以及它为什么创建一个列表?

python python-3.x

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

我可以用sum()加入列表吗?

sum()用于列表连接是pythonic 吗?

>>> sum(([n]*n for n in range(1,5)),[])
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
Run Code Online (Sandbox Code Playgroud)

python algorithm join list

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

如何重写此Flask视图函数以遵循post/redirect/get模式?

我有一个小的日志浏览器.它根据用户的输入检索并显示以前记录的记录列表.它不会更新任何内容.

代码非常简单,工作正常.这是一个简化版本:

@app.route('/log', methods=['GET', 'POST'])
def log():
    form = LogForm()
    if form.validate_on_submit():
        args = parse(form)
        return render_template('log.html', form=form, log=getlog(*args))
    return render_template('log.html', form=form)
Run Code Online (Sandbox Code Playgroud)

但是它不遵循post/redirect/get模式,我想解决这个问题.

我应该在哪里存储发布数据(即args)之间的帖子和获取?什么是标准或推荐的方法?我应该设置一个cookie吗?我应该使用flask.session对象,在那里创建一个缓存吗?你能指点我正确的方向吗?大部分时间我都在写后端...


更新:

我发布了生成的代码.

@app.route('/log', methods=['POST'])
def log_post():
    form = LogForm()
    if form.validate_on_submit():
        session['logformdata'] = form.data
        return redirect(url_for('log'))
    # either flash errors here or display them in the template
    return render_template('log.html', form=form)

@app.route('/log', methods=['GET'])
def log():
    try:
        formdata = session.pop('logformdata')
    except KeyError:
        return render_template('log.html', form=LogForm())

    args = parse(formdata)
    log = getlog(args)
    return render_template('log.html', form=LogForm(data=formdata), log=log)
Run Code Online (Sandbox Code Playgroud)

python flask

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

如何获取与某个单词相关的相似单词?

我正在尝试解决一个 nlp 问题,其中我有一个单词字典,例如:

list_1={'phone':'android','chair':'netflit','charger':'macbook','laptop','sony'}
Run Code Online (Sandbox Code Playgroud)

现在,如果输入是 'phone' 我可以轻松地使用 'in' 运算符通过按键获取电话及其数据的描述,但问题是输入是否类似于 'phones' 或 'Phones' 。

我想如果我输入“电话”然后我会得到这样的词

'phone' ==> 'Phones','phones','Phone','Phone's','phone's' 
Run Code Online (Sandbox Code Playgroud)

我不知道我可以使用哪个 word2vec 以及哪个 nlp 模块可以提供这样的解决方案。

第二个问题是,如果我给出一个词“狗”,我可以得到“小狗”、“基蒂”、“狗”、“狗”等词吗?

我尝试过类似的方法,但它给出了同义词:

from nltk.corpus import wordnet as wn
for ss in wn.synsets('phone'): # Each synset represents a diff concept.
    print(ss)
Run Code Online (Sandbox Code Playgroud)

但它返回:

Synset('telephone.n.01')
Synset('phone.n.02')
Synset('earphone.n.01')
Synset('call.v.03')
Run Code Online (Sandbox Code Playgroud)

相反,我想要:

'phone' ==> 'Phones','phones','Phone','Phone's','phone's' 
Run Code Online (Sandbox Code Playgroud)

python nlp nltk gensim spacy

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

如何在Python中创建DOT文件?

我有一个数字电路模拟器,需要绘制几乎完全像这个问题的电路图(和答案)与dot/graphviz的方框图布局

这是我第一次遇到DOT和graphviz.幸运的是,DOT语言规范可用,并且还有许多示例.

然而,我仍然不清楚一个细节,我要问的是一个新手:我有一个完整的数据来绘制图表.如何从中创建DOT文件?

作为文字逐行?

# SIMPLIFIED PSEUDOCODE
dotlines = ["digraph CIRCUIT {"]
for node in all_nodes:
    dotlines.append("  {}[{}];".format(node.name, node.data))
for edge in all_edges:
    dotlines.append("  {} -> {};".format(edge.from_name, edge.to_name))
dotlines.append['}']
dot = "\n".join(dotlines)
Run Code Online (Sandbox Code Playgroud)

或者我应该以某种方式转换我的数据并使用一些模块以DOT格式导出它?

python dot graphviz

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

如何在代码中按降序减去星号?

我希望弹珠点显示在输出中,并且随着弹珠数量的减少,星号也会减少。我不知道什么命令会让星号在 while 循环运行时下降。

#!/usr/bin/env python3

marbles = 10  #You start out with 10 marbles
marble_dots = "**********" #Pretend these are ten marbles

while (marbles > 0):
   print(marble_dots[:10])

   #This prints out how many marbles you have left.
   # We have to say str(marbles) because marbles is a number
   # and we want to use it in a string (letters and other characters)
   print("You have " + str(marbles) + " marbles left.")

   if (marbles < 4):
       print("Warning: You are running low on …
Run Code Online (Sandbox Code Playgroud)

python

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

如何排序不完整?

我有一个要排序的元素列表和一个比较函数cmp(x,y),该函数确定是否x应在之前y或之后出现y。问题是某些元素没有定义的顺序。该cmp函数返回“ 不关心 ”。

示例:输入:[A,B,C,D],和C > DB > D。输出:许多正确答案,例如[D,C,B,A][A,D,B,C]。我需要的是所有可能输出中的一个输出。

我无法为此使用Python sort,我的解决方案是老式的泡沫排序 以一个空列表开始,并一次在正确的位置插入一个元素,以使列表始终保持排序。

是否可以为此目的使用内置的sort/ sorted函数?关键是什么?

python sorting algorithm

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

如何将 UTF-8“发件人:”地址添加到邮件消息中?

我正在尝试发送电子邮件,但邮件内容标题部分的发件人地址有一个小问题。

基本上,这就是我想要在标题中包含的内容:

From: "Real Name" <test@example.com>
Run Code Online (Sandbox Code Playgroud)

这就是我所做的(Python 3.5):

message = email.mime.text.MIMEText(body)
message.add_header('From', from_hdr)
Run Code Online (Sandbox Code Playgroud)

它适用于 ASCII,但不适用于 UTF-8。

给定一个非 ASCII 名称,如"Strángé Nämé" <test@example.com>输入被编码为add_header()

如果该值包含非 ASCII 字符 ..... 它会使用 UTF-8 的 CHARSET 和 None 的 LANGUAGE 以 RFC 2231 格式自动编码。

问题是整个字符串——不仅仅是真实姓名——都被编码了。结果看起来像一个字符串:=?utf-8?.....?=并且原始格式丢失了。邮件服务器将明显丢失的域添加到其中,损坏就完成了。

然后将发件人显示为(由收件人的电子邮件程序解码)为: "\"Strángé Nämé\" <test@example.com>"@server.example.com

我曾尝试使用拆分地址email.utils.parseaddr()并仅对实名部分进行编码,email.utils.encode_rfc2231()但这没有帮助。

我现在避免在 Form: 字段中使用 UTF-8,不知道如何正确处理它。能否请你帮忙?

python email

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

标签 统计

python ×12

algorithm ×2

dot ×1

email ×1

flask ×1

gensim ×1

graphviz ×1

join ×1

list ×1

nlp ×1

nltk ×1

python-3.x ×1

python-asyncio ×1

sorting ×1

spacy ×1