我试图从回溯中提取信息,但出现错误。
我想删除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库中的任何地方都找不到这些基本常量.
STDIN = 0
STDOUT = 1
STDERR = 2
Run Code Online (Sandbox Code Playgroud)
这是微不足道的,但我简直无法相信我必须自己定义它们.
我花了一些时间阅读电子邮件库模块的文档。我们有一个新的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
可以从邮件标题中提取地址。我仍然喜欢明确地传递地址。
为什么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清理甚至拒绝请求.
从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
.你能解释它是如何工作的以及它为什么创建一个列表?
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) 我有一个小的日志浏览器.它根据用户的输入检索并显示以前记录的记录列表.它不会更新任何内容.
代码非常简单,工作正常.这是一个简化版本:
@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) 我正在尝试解决一个 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) 我有一个数字电路模拟器,需要绘制几乎完全像这个问题的电路图(和答案)与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格式导出它?
我希望弹珠点显示在输出中,并且随着弹珠数量的减少,星号也会减少。我不知道什么命令会让星号在 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) 我有一个要排序的元素列表和一个比较函数cmp(x,y)
,该函数确定是否x
应在之前y
或之后出现y
。问题是某些元素没有定义的顺序。该cmp
函数返回“ 不关心 ”。
示例:输入:[A,B,C,D]
,和C > D
,B > D
。输出:许多正确答案,例如[D,C,B,A]
或[A,D,B,C]
。我需要的是所有可能输出中的一个输出。
我无法为此使用Python sort
,我的解决方案是老式的泡沫排序 以一个空列表开始,并一次在正确的位置插入一个元素,以使列表始终保持排序。
是否可以为此目的使用内置的sort
/ sorted
函数?关键是什么?
我正在尝试发送电子邮件,但邮件内容标题部分的发件人地址有一个小问题。
基本上,这就是我想要在标题中包含的内容:
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,不知道如何正确处理它。能否请你帮忙?