提前为混淆功能和方法道歉,我目前没有时间来理清术语,但我知道这种区别(通常)。
我正在尝试通过命令行参数控制脚本运行的函数。在这里和其他地方经过大量阅读之后,我正朝着以下例子的方向前进。
# After connecting to a database with MySQLdb and defining a cursor...
cursor.execute(some_query_stored_earlier)
for row in cursor:
for method_name in processing_methods: # ('method1','method2', ...)
globals()[method_name](row)
(澄清:processing_methods
是一个由用nargs='*'
命令行参数组成的用户定义字符串元组。)
然而,我遇到print
的问题(不出意外)。我希望print
成为:
让我承认,通过取消第一个和第三个标准并简单地做,我可以让自己更轻松:
for row in cursor:
print row
for method_name in processing_methods:
globals[method_name](row)
但我真的不想总是在每行打印有时会产生数百万行的结果。我做了一个未来的进口,希望这能解决我的问题 - 没有这样的运气。所以我做了一点探索:
>>> from __future__ import print_function
>>> print
<built-in function print>
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'print_function': _Feature((2, 6, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 65536), '__package__': None}
>>> a = "Hello, world!"
>>> print(a)
Hello, world!
>>> globals()['print'](a)
Traceback (most recent call last):
File "<pyshell#33>", line 1, in <module>
globals()['print'](a)
KeyError: 'print' # Okay, no problem, obviously it's...
>>> globals()['print_function'](a)
Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module>
globals()['print_function'](a)
AttributeError: _Feature instance has no __call__ method # ...huh.
然后我做了一点阅读,this Q&A提示了更多的探索:
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__']
>>> __builtins__
<module '__builtin__' (built-in)>
>>> 'print' in dir(__builtins__)
True # now we're getting somewhere!
>>> __builtins__.print something
SyntaxError: invalid syntax # fair enough.
>>> __builtins__.print('something')
SyntaxError: invalid syntax # wait, what?
>>> dir(__builtins__.print)
SyntaxError: invalid syntax # -_-
这里发生了一件我不明白的事情,this other Q&A并没有让它更清楚。我认为对我的特定问题的简单解决方案将是一个稍微尴尬的包装,如:
def printrows(row):
print row # assuming no future import, of course
但它让我发疯:为什么我不能通过全局词典访问print
?我做错了,还是只是内置函数无法做到的事情?
答案 0 :(得分:2)
当你第二次尝试打开一个新的shell时(你得到了所有这些语法错误),你是否忘记重复from __future__ import print_function
?它对我有用:https://ideone.com/JOBAAk
答案 1 :(得分:2)
如果你做了一个看似毫无用处的任务,它就会按照我的预期方式运作。我不是这里工作的内部专家,所以我无法解释为什么这是有效的,但确实如此。
>>> from __future__ import print_function
>>> row="Hello world"
>>> print = print
>>> globals()['print'](row)
Hello world