Sys «временно» импортируется при вызове print? - PullRequest
0 голосов
/ 04 декабря 2018

Я искал документацию Python для print, в которой говорится:

print (* objects, sep = '', end = '\ n', file= sys.stdout, flush = False)

Как видно, если file для печати не указан, используется значение по умолчанию sys.stdout, что заставило меня задуматься.

Вызов print определенно не импортирует sys в фоновом режиме, так как это работает?

это sys.stdout каким-то образом достижимо отовсюду?


Пример:

Я использую PyCharm и хочу создать функцию, которая либо печатает сообщение text в файл, либона стандартный вывод.Я начал писать:

def my_print(text, file=None):
    print(text, file=file if file is not None else ?)

Так что же будет после else?sys.stdout не работает и, очевидно, я не заинтересован в подробностях:

def my_print(text, file=None):
    if file is None:
        print(text)
    else:
        print(text, file=file)

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Я думаю, @DanielRoseman дал хорошее представление о , почему реализация не обязательно дает вам доступ к sys напрямую, но для решения последней части вашего вопроса вы можете использовать этот подход..:

def my_print(text, file=None):
    print(text, **({'file': file} if file else {}))

... где вы в основном распаковываете аргумент file=file, если присутствует file, в противном случае не передаете аргумент.

С точки зрения читабельности я думаю, что ваш оригиналреализация, однако, превосходна.


На самом деле вы можете просто передать None:

def my_print(text, file=None):
    print(text, file=file)

... и это будет просто print text, если fileне предоставляется ...

0 голосов
/ 04 декабря 2018

Другой ответ указывает на то, что печать реализована на C. Однако, , даже если это было реализовано на Python, это не означало бы, что sys было доступно везде.

Рассмотрим этот код:

utils.py

import sys

def my_print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False):
    file.write(sep.join(objects))

main.py

from utils import print

my_print('foo')

Здесь sys доступен только в утилитах, но печать все равно будет выводиться наsys.stdout без доступа к основному.

...