関数とメソッドを混同していることを事前にお詫びします。現時点では用語を整理する時間がありませんが、(一般的に)違いは認識しています。
コマンドライン引数を使用して、スクリプトによって実行される関数を制御しようとしています。ここや他の場所で多くのことを読んだ後、次の例の方向に進んでいます。
# 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
:
- コマンドラインから指定される可能性があるメソッドの中で;
- コマンドラインからメソッドが指定されていない場合のデフォルトのメソッド。
- コマンド ラインから ONLY OTHER メソッドが指定されている場合は実行されません。
1 番目と 3 番目の基準を排除し、単純に次のことを行うことで、物事を簡単に行えることを認めさせてください。
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.
それで、私はもう少し読んで、この 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 # -_-
ここで私には理解できないことが起こっており、この別の Q&Aではそれが明確にされていません。私の特定の問題に対する簡単な解決策は、次のようなやや扱いにくいラッパーになると思います。
def printrows(row):
print row # assuming no future import, of course
print
しかし、それは私を夢中にさせています:グローバル辞書を介してアクセスできないのはなぜですか? 私はそれを間違っていますか、それとも組み込み関数ではできないことですか?