2

为混淆功能和方法提前道歉,我目前没有时间整理术语,但我知道区别(通常)。

我试图通过命令行参数控制我的脚本运行哪些函数。在此处和其他地方大量阅读之后,我正朝着以下示例的方向前进。

# 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 字典访问?我做错了吗,或者它只是你不能用内置函数做的事情?

4

2 回答 2

2

当您打开一个新的 shell 进行第二次尝试时,您是否忘记重复from __future__ import print_function(您遇到了所有这些语法错误)?它对我有用:https ://ideone.com/JOBAAk

于 2013-06-27T20:10:58.673 回答
2

如果你做了一个看似无用的作业,它会按照我认为你预期的方式工作。我不是这里工作的内部专家,所以我无法解释为什么会这样,但确实如此。

>>> from __future__ import print_function
>>> row="Hello world"
>>> print = print
>>> globals()['print'](row)
Hello world
于 2013-06-27T20:31:16.760 回答