为混淆功能和方法提前道歉,我目前没有时间整理术语,但我知道区别(通常)。
我试图通过命令行参数控制我的脚本运行哪些函数。在此处和其他地方大量阅读之后,我正朝着以下示例的方向前进。
# 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
成为:
- 在可能从命令行指定的方法中;
- 从命令行指定 NO 方法时的默认方法;
- 如果仅从命令行指定了其他方法,则不执行。
让我承认,我可以通过消除第一个和第三个标准并简单地做:
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.
所以后来我又看了一些书,这个问答引发了更多的探索:
>>> 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 # -_-
这里发生了一些我只是不明白的事情,而其他问答并没有让它变得更清楚。我认为我的特定问题的简单解决方案将是一个有点尴尬的包装,比如:
def printrows(row):
print row # assuming no future import, of course
但这让我发疯:为什么我print
不能通过 globals 字典访问?我做错了吗,或者它只是你不能用内置函数做的事情?