sys.stdin.read() 如何改变文字参数的结构?

How Does sys.stdin.read() Change the Structure of a Literal Parameter?

背景故事: 在我之前的 post 中,我想知道某个函数是否可以有效地替换另一个函数,所以,从技术上讲,我不知道需要一个答案来帮助我的项目,但我只是想知道 “如果我继续使用 sys.stdin.read() 而不是 input(),我将如何克服我的障碍之一?”

我的问题: 出于某种原因,当我使用 sys.stdin.read() 时,它不适用于文字字符串或字符。这是我的代码的一个懒惰但有效的重建...

print("Type p or P for a pyramid")
print("Type s or S for the sum and product of two numbers")
choice_1 = sys.stdin.read()

# edge case for inputted char being invalid
if str(choice_1) != ('p' or 'P' or 's' or 'S')
    err_test = 'z'
    while str(err_test) != ('p' or 'P' or 's' or 'S')
        print("Invalid option!)
        print("Type p or P for a pyramid")
        print("Type s or S for the sum and product of two numbers"
        err_test = sys.stdin.read()
        if err_test == ('p' or 'P' or 's' or 'S')
            break

这段代码大概就是我写的。我不是在家里写这个问题,所以我无法逐字复制。如果您看到任何问题,请将它们列出来,无论是语法错误还是格式错误。我想尽可能多地学习,但是如果您知道为什么评论正下方的行(第 6 行)不起作用,请告诉我!谢谢!

**编辑:**非常感谢您的反馈!不过我忘了说,有一次我尝试找出问题所在,所以我创建了一个新的 python 文件并创建了一个永远持续的循环并仅用一个字符对其进行了测试。我会把它超级简化:

char = sys.stdin.read()
if char == 'a':
    print("This works!")
if char != 'a':
    print("This failed!)

即使这个代码^^^ 也不起作用!请告诉我原因。 –

您对“匹配几个接受的字符串之一”的测试与 this question's mistake 类似,是错误的;由于使用了括号,它并不完全相同,但在这种情况下,您的两个测试都等同于测试 leftside != 'p',因为 or 链评估为第一个真实值,或者最后一个值,如果全部都是假的,任何 non-empty 字符串都是真值,所以带括号的分组简化为 'p'。你想要 leftside in ('p', 'P', 's', 'S')(或者在现代 Python 上可能稍微快一点,它优化了针对 set 文字的文字的测试,以在编译时构造一个等效的 frozenset 并重用它,允许 O(1) 平均案例查找,而不是 O(n) tuple 扫描工作,leftside in {'p', 'P', 's', 'S'}).

此外,input 将读取一行,去除换行符,然后 return 它,而 sys.stdin.read() 会消耗标准输入的 全部 在第一次调用(所有线路)时,将其留空,因此再次尝试调用它不会收到任何信息。如果出于某种原因 不能 使用 input,则 next(sys.stdin).rstrip('\n')sys.stdin.readline().rstrip('\n') 将大致等同于普通的 input()input 在某些方面更强大,例如它具有 readline 集成,但它很接近)。

最后,一个小提示:没有理由做 str(choice_1)str(err_test)(它们已经 str,所以用 str 包装是没有意义的)。