Как говорили другие источники, значение для openhook
должно быть функцией, но это не значит, что вы не можете вызвать функцию для возврата функции. Например, если вы хотите поддерживать несколько разных типов входящих файлов, вы можете написать что-то вроде этого:
import fileinput
import gzip
def get_open_handler(compressed):
if deciding_data:
# mode comes in as 'r' by defualt, but that means binary to `gzip`
return lambda file_name, mode: gzip.open(file_name, mode='rt')
else:
# the default mode of 'r' means text for `open`
return open
# get args here
for line in fileinput.input(args.files, openhook=get_open_handler(args.compressed))
print(line)
Как видите, мы вызываем функцию из openhook
, но эта функция возвращает другую функцию. В этом случае мы исправляем mode
из gzip.open
, но мы можем делать все, что захотим, в том числе используя functools.partial
, чтобы привязать некоторые значения к функции, чтобы при передаче значений по умолчанию filename
и mode
функции, назначенной на openhook
, функция будет выполнять то, что вы хотите.