为啥它在控制台进程中以退出代码 0 结束而不是打印 'sen' 变量这样说? [复制]
Posted
技术标签:
【中文标题】为啥它在控制台进程中以退出代码 0 结束而不是打印 \'sen\' 变量这样说? [复制]【英文标题】:why does this it say in the console Process finished with exit code 0 instead of printing the 'sen' variable? [duplicate]为什么它在控制台进程中以退出代码 0 结束而不是打印 'sen' 变量这样说? [复制] 【发布时间】:2020-09-26 17:04:17 【问题描述】:import random
import sys
def v1_debug(v1, subject):
if v1 != str and subject != str:
sys.exit()
else:
if subject == 'He' or 'She' or 'It':
for i in v1:
if i == [len(v1)+1]:
if i == 's' or 'z' or 'x' or 'o':
v1 = v1 + 'es'
elif i == 'y':
v1 = v1 - 'y' + 'ies'
elif v1[len(v1)] == 's' and v1[len(v1)+1] == 'h':
v1 = v1 + 'es'
elif v1[len(v1)] == 'c' and v1[len(v1)+1] == 'h':
v1 = v1 + 'es'
if subject == 'I' or 'You' or 'We' or 'They':
for i in v1:
if i == v1[len(v1)+1]:
v1 = v1 + 'ing'
return ''
def default_positive_form():
try:
sbj = ['He',
'She',
'It',
'I',
'You',
'We',
'They']
v1 = ['be',
'beat',
'become',
'begin',
'bend',
'bet',
'bid',
'bite',
'blow',
'break',
'bring',
'build',
'burn',
'buy',
'catch',
'choose',
'come',
'cost',
'cut',
'dig',
'dive',
'do',
'draw',
'dream',
'drive',
'drink',
'eat',
'fall',
'feel',
'fight',
'find',
'fly',
'forget',
'forgive',
'freeze',
'get',
'give',
'go',
'grow',
'hang',
'have',
'hear',
'hide',
'hit',
'hold',
'hurt',
'keep',
'know',
'lay',
'lead',
'leave',
'lend',
'let',
'lie',
'lose',
'make',
'mean',
'meet',
'pay',
'put',
'read',
'ride',
'ring',
'rise',
'run',
'say',
'see',
'sell',
'send',
'show',
'shut',
'sing',
'sit',
'sleep',
'speak',
'spend',
'stand',
'swim',
'take',
'teach',
'tear',
'tell',
'think',
'throw',
'understand',
'wake',
'wear',
'win',
'write']
sbj = random.choice(sbj)
v1 = random.choice(v1)
verb_debug = v1_debug(v1, sbj)
sen = ''
if sbj == 'I':
sen = sbj + 'am' + verb_debug
elif sbj == 'He' or 'She' or 'It':
sen = sbj + 'is' + verb_debug
elif sbj == 'You' or 'We' or 'They':
sen = sbj + 'are' + verb_debug
print(f'sen')
except NameError:
print('this is bullshit')
return
default_positive_form()
这是python 3.8
【问题讨论】:
请注意,好的minimal reproducible example 的一部分在于它是minimal——它是产生相同问题的最短的代码。当然没有必要包括完整的单词列表。哎呀,您可以完全消除随机选择的使用,仍然能够证明问题。 你认为if v1 != str and subject != str
是做什么的?提示:它不检查那些变量是否是字符串;它测试它们是否指向str
类型常量。
...无论如何,这就是为什么只调用sys.exit()
而不事先打印任何调试是一个普遍的坏主意的部分原因;它不会为您提供有关为什么您的程序退出的任何线索。最好在遇到错误时引发异常。
【参考方案1】:
sen
仅在您的if/elif/elif
块的条件都不满足时才包含一个空字符串。将打印行更改为
print(f"sen is: sen")
但这不是真正的问题。 obj != str
不检查 obj
是否为字符串,它检查对象是否指向类型常量 str
(感谢 Charles Duffy 的评论)。相反,使用内置函数isinstance()
,如下所示:
if not isinstance(v1, str) and not isinstance(subject, str):
print("Variables are the wrong type!")
sys.exit()
【讨论】:
显然不是问题所在。如果添加包含sen = "Don't know how to handle subject: " + sbj
的else
子句,仍然会发生;见ideone.com/T6Z3va
相反,错误类型检查后的sys.exit()
才是问题所在。
@CharlesDuffy 是的,我刚刚更新了我的答案。再想一想,也许我会完全改变它。以上是关于为啥它在控制台进程中以退出代码 0 结束而不是打印 'sen' 变量这样说? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 JScript(Windows 脚本宿主)在未捕获的异常中以 0 退出?