Nano Hash - криптовалюты, майнинг, программирование

Приватные функции в питоне

Можно ли избежать импорта файла с from file import function? Кто-то сказал мне, что мне нужно поставить подчеркивание в качестве префикса, например: _function, но это не работает.

Я использую Python 2.6 из-за устаревшего кода.

18.01.2017

  • Это невозможно в Python. Однако вы можете влиять на то, что импортируется в from .. import *, используя __all__ (и ведущие символы подчеркивания). Изменение имени также связан. 19.01.2017
  • Вы также не хотите думать об этом как об импорте файла. Вы импортируете функцию из модуля. 19.01.2017
  • Я не знаю, нужно ли отклонять этот вопрос - вопрос действителен. Лучшие ответы должны включать некоторое объяснение соглашений Python, чтобы помочь другим, у которых может возникнуть этот вопрос в будущем. Возможно, вам поможет более подробное объяснение того, что вы имеете в виду под «не работает» и почему вы хотите это сделать? 19.01.2017

Ответы:


1

Есть способы предотвратить импорт, но они, как правило, являются хакерами, и вы должны избегать их. Обычный метод - просто использовать подчеркивание:

def _function():
    pass

Затем, когда вы импортируете,

from my_module import *

Вы заметите, что _function не импортируется, поскольку начинается с подчеркивания. Однако вы всегда можете сделать это:

# In Python culture, this is considered rude
from my_module import _function

Но ты не должен этого делать. Просто не делай этого, и все будет хорошо. Отношение Питона в том, что мы все взрослые люди. Есть много других вещей, которые вы не должны делать, которые намного хуже, например

import my_module
# Remove the definition for _function!
del my_module._function
18.01.2017
  • Спасибо @DietrichEpp. Не могли бы вы высказать свое мнение по этому вопросу: " title="правильный способ реализации одной функции для каждого файла в python"> stackoverflow.com/questions/41727874/ ? Я хотел бы прочитать ваше мнение. 19.01.2017

  • 2

    В Python нет конфиденциальности. Существуют только соглашения, определяющие, какой внешний код должен считаться общедоступным и пригодным для использования.

    Импорт модуля в первый раз вызывает создание объекта модуля и выполнение всего кода верхнего уровня в модуле. Объект модуля содержит глобальное пространство имен с результатом выполнения этого кода.

    Поскольку Python динамичен, вы всегда можете самостоятельно изучить пространство имен модуля; вы можете видеть все определенные имена, все объекты, на которые ссылаются эти имена, и вы можете получить доступ и изменить все. Здесь не имеет значения, начинаются эти имена с подчеркивания или нет.

    Таким образом, единственная причина, по которой вы используете подчеркивание _ в начале имени, заключается в том, чтобы документировать, что имя является внутренним для реализации модуля, и что внешний код не должен полагаться на это имя, существующее в будущем. версия. Синтаксис from module import * будет игнорировать такие имена только по этой причине. Но вы все равно не можете помешать целеустремленному программисту получить доступ к такому имени. Они просто делают это на свой страх и риск, вы не несете ответственности за то, чтобы не допустить их к этому.

    Если у вас есть функции или другие объекты, которые нужны только для инициализации модуля, вы, конечно, можете удалить эти имена в конце.

    18.01.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..