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

我可以在解释器解析代码之前断言python版本吗?,python,f-string,version-detection,Python,F String,Version Detection,我想告诉用户应该使用哪个python版本: 导入系统 断言sys.version_info>=(3,6),“使用Python 3.6或更新版本” 打印(f“格式字符串”) 但是,运行上述文件会产生语法错误: $python fstring.py.#默认python是2.7 文件“fstring.py”,第3行 打印(f“格式字符串”) ^ SyntaxError:无效语法 是否可以对每个文件执行此操作,而不将所有f字符串包装在try块中?否,这不可能对每个文件执行,因为在执行任何文件之前,以

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

导入系统 断言sys.version_info>=(3,6),“使用Python 3.6或更新版本” 打印(f“格式字符串”) 但是,运行上述文件会产生语法错误:

$python fstring.py.#默认python是2.7
文件“fstring.py”,第3行
打印(f“格式字符串”)
^
SyntaxError:无效语法

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

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

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

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


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

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

  • foo\u模块/
    • \uuuu init\uuuuu.py
    • foo\u模块/
      • foo.py
    • setup.py
其中
\uuuu init\uuuu.py
包含

导入系统 断言sys.version_info>=(3,6),“使用Python 3.6或更新版本”
foo.py
包含

打印(f“格式字符串”)
例如:

Python 2.7.18(默认值,2020年6月23日,19:04:42)
linux2上的[GCC 7.5.0]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>从foo_模块导入foo
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“foo_module/_init__.py”,第4行,在
断言sys.version_info>=(3,6),“使用Python 3.6或更新版本”
AssertionError:使用Python 3.6或更新版本

这适用于每个模块,但问题是“每个文件”。@kaya3,是的,我错过了问题中的“每个文件”。尽管如此,我还是不打算讨论这个问题,因为它可以帮助其他用户寻找模块的解决方案。你的答案对于单文件案例是正确的。这解决了我的问题,尽管我问了一个稍微不同的问题。我会接受另一个答案,但我对这个答案投了更高的票。用户想要做的就是检查/打印当前运行的Python版本-当然他们可以使用
sys.version\u info
@barny来完成。这根本不是问题所在;我不明白你是如何阅读这个问题并得出这个结论的。@barny,但他们不能这样做,在同一段源代码中使用f字符串。所以,总结一下,如果你在Python脚本中有任何f字符串,除非将所有f字符串更改为
格式
样式,否则不能明确地告诉用户使用正确的Python版本。对吗?如果这是一个选项,您可以将文件重命名为
.py3
扩展名。不幸的是,这对我来说不是一个选项。请注意,您也不能在try块中包装f字符串<代码>语法错误s在编译代码时引发使用
f启动脚本“如果在错误消息中看到这一点,请使用Python 3.6或更新版本”
?:-P并不漂亮,但可能会达到目的。