【发布时间】:2015-11-19 18:42:26
【问题描述】:
我的所有脚本自始至终都使用 Unicode 文字,其中
from __future__ import unicode_literals
但是当有可能使用字节串调用函数时,这会产生一个问题,我想知道处理这个问题并产生明显有用的错误的最佳方法是什么。
我gather 我采用的一种常见方法是在它发生时简单地说明这一点,例如
def my_func(somearg):
"""The 'somearg' argument must be Unicode."""
if not isinstance(arg, unicode):
raise TypeError("Parameter 'somearg' should be a Unicode")
# ...
对于所有需要是 Unicode 的参数(并且可能是字节串)。但是,即使我这样做,如果提供的参数对应于此类参数,我的argparse 命令行脚本也会遇到问题,我想知道这里最好的方法是什么。似乎我可以简单地检查这些参数的编码,并使用该编码对它们进行解码,例如
if __name__ == '__main__':
parser = argparse.ArgumentParser(...)
parser.add_argument('somearg', ...)
# ...
args = parser.parse_args()
some_arg = args.somearg
if not isinstance(config_arg, unicode):
some_arg = some_arg.decode(sys.getfilesystemencoding())
#...
my_func(some_arg, ...)
这种方法组合是否是可能接收字节串输入的 Unicode 模块的常见设计模式?具体来说,
- 我能否以这种方式可靠地解码命令行参数,并且
-
sys.getfilesystemencoding()会给我正确的命令行参数编码;或 -
argparse是否提供了一些内置工具来完成我错过的这一点?
【问题讨论】:
-
unicode_literals导入与用于命令行参数的字符编码无关。 -
@J.F.Sebastian:怎么会这样?使用
unicode_literals意味着我的代码使用Unicode 文字,因此任何命令行字符串都会被解码。这就是为什么我需要知道编码;否则我会得到例外。 -
命令行不是 Python 代码的一部分。你了解“字面”这个词吗?例如,
some_python_name不是字符串文字,无论some_python_name具有何种类型。 Python 源代码中的"abc"是字符串文字(没有unicode_literals它是 Python 2 上的字节字符串)。sys.argv[i]不是文字:无论您是否使用unicode_literals,它的值都不会改变(print sys.argv自己看看)。 -
@J.F.Sebastian:我想你不明白这个问题。
-
我正在进一步调查这个问题,因为似乎有关于它的相互冲突的引用。还有bugs,所以你可能想提到你的平台/操作系统。
标签: python-2.7 unicode command-line-arguments