我可以在解释器解析代码之前断言python版本吗?

2024-09-28 17:21:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想告诉用户应该使用哪个python版本:

import sys
assert sys.version_info >= (3, 6), "Use Python 3.6 or newer"
print(f"a format string")

但是,运行上述文件会产生语法错误:

$ python fstring.py. # default python is 2.7
  File "fstring.py", line 3
    print(f"a format string")
                           ^
SyntaxError: invalid syntax

是否可以对每个文件执行此操作,而不在try块中包装所有f字符串


Tags: or文件用户pyimport版本infoformat
2条回答

不,这在每个文件的基础上是不可能的,因为在执行任何文件之前,以及在检查任何断言之前,都会对整个文件进行解析try也不起作用,因为同样的原因

唯一可行的方法是,通过将代码放入字符串并调用eval,将部分代码的解析推迟到运行时,但是。。。不要那样做。您有两个明智的选择:根本不使用f字符串,或者让它以SyntaxError而不是您自己的自定义错误消息失败

或者,如果您在Unix或Linux系统上工作,那么您可以将文件标记为可执行文件,并在开始时给它一个shebang行,如#!/usr/bin/python3.8,这样用户就不需要知道正确的版本来使用自己

如果您想在每个模块的基础上进行此操作,请参见@Chris的答案

如果您正在编写模块,则可以通过模块的__init__.py来完成此操作,例如,如果您有

  • foo_module/
    • __init__.py
    • foo_module/
      • foo.py
    • setup.py

其中__init__.py包含

import sys


assert sys.version_info >= (3, 6), "Use Python 3.6 or newer"

foo.py包含

print(f"a format string")

例如:

Python 2.7.18 (default, Jun 23 2020, 19:04:42) 
[GCC 7.5.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from foo_module import foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "foo_module/__init__.py", line 4, in <module>
    assert sys.version_info >= (3, 6), "Use Python 3.6 or newer"
AssertionError: Use Python 3.6 or newer

相关问题 更多 >