为啥它在控制台进程中以退出代码 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: " + sbjelse 子句,仍然会发生;见ideone.com/T6Z3va 相反,错误类型检查后的sys.exit()才是问题所在。 @CharlesDuffy 是的,我刚刚更新了我的答案。再想一想,也许我会完全改变它。

以上是关于为啥它在控制台进程中以退出代码 0 结束而不是打印 'sen' 变量这样说? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

进程在 PyCharm 中以退出代码 137 结束

在 Python 中以 1 退出

为啥我的 JScript(Windows 脚本宿主)在未捕获的异常中以 0 退出?

C语言中exit函数的使用

如果进程以退出代码 0 结束,我应该调用 Process.destroy() 吗?

为啥构建后步骤 (xcopy) 偶尔会在 TeamCity 构建中以代码 2 退出?