我可以在解释器解析代码之前声明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

是否可以在不将所有f字符串包装在try块内的情况下针对每个文件执行此操作?

解决方法

否,这不可能在每个文件的基础上进行,因为解析是在整个文件执行之前进行的,因此是在检查任何断言之前进行的。由于同样的原因,try也将不起作用。

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

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

如果要改为按模块进行操作,请参阅@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,"Use Python 3.6 or newer"
AssertionError: Use Python 3.6 or newer