На этот вопрос довольно удобно ответили уже на практике, но существует один момент, который я упоминаю, ниже которого я не видел, что кто-либо еще повышает все же.
, Так как нам сказали принять a> = 0, и первое условие гарантирует, что b - (+ p)> = 0, на кронштейнах || тесты могут быть превращены в тесты против неравенства с 1:
(+ p < = b) & & (a! = 1) & & (b> = p) & & (b - p! = 1)
заманчиво удалить проверку (b> = p), который дал бы выражение nickf. И это - почти наверняка корректное практическое решение. К сожалению, мы должны знать больше о проблемной области перед способностью сказать, безопасно ли сделать это.
, Например, при использовании C и 32-разрядный неподписанный ints для типов a, b, и p, рассматривают случай где = 2^31 + 7, p = 2^31 + 5, b = 13. У нас есть a> 0, (+ p) = 12 < b, но b < p. (Я использую '^' для указания на возведение в степень, не C поразрядный xor.)
, Вероятно, Ваши значения не приблизятся к виду диапазонов, где этот вид переполнения является проблемой, но необходимо проверить это предположение. И если это оказывается возможностью, добавьте комментарий с тем выражением, объяснив это так, чтобы некоторый рьяный будущий оптимизатор небрежно не удалял (b> = p) тест.
Вероятно, лучший способ сделать это - использовать директиву setuptools
package_data
. Это действительно означает использование setuptools
(или distribute
) вместо distutils
, но это очень плавное «обновление».
Вот полное (но непроверенное) ) пример:
from setuptools import setup, find_packages
setup(
name='your_project_name',
version='0.1',
description='A description.',
packages=find_packages(exclude=['ez_setup', 'tests', 'tests.*']),
package_data={'': ['license.txt']},
include_package_data=True,
install_requires=[],
)
Обратите внимание на конкретные строчки, которые здесь важны:
package_data={'': ['license.txt']},
include_package_data=True,
package_data
- это dict
имен пакетов (пусто = все пакеты) к списку шаблонов (может включать глобусы) . Например, если вы хотите указать только файлы в своем пакете, вы тоже можете это сделать:
package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}
Решением здесь будет однозначно , а не переименование файлов, отличных от py
, с .py
расширение.
Подробнее см. презентация Яна Бикинга .
Другой подход, который хорошо работает, если вы просто хотите контролировать содержимое исходного дистрибутива ( sdist
) и иметь файлы вне пакета (например, каталог верхнего уровня), - это добавьте файл MANIFEST.in
. См. документацию Python , чтобы узнать о формате этого файла.
С момента написания этого ответа я обнаружил, что использование MANIFEST.in
обычно менее разочаровывающий подход, чтобы просто убедиться, что ваш В дистрибутиве исходного кода ( tar.gz
) есть нужные вам файлы.
Например, если вы хотите включить requirements.txt
с верхнего уровня, рекурсивно включите каталог «данных» верхнего уровня:
include requirements.txt
recursive-include data *
Тем не менее, чтобы эти файлы были скопированы во время установки в папку пакета внутри site-packages, вам нужно указать include_package_data = True
в функцию setup ()
. См. Добавление файлов без кода для получения дополнительной информации.
Придумал обходной путь: я переименовал свой lgpl2.1_license.txt
в lgpl2.1_license.txt.py
и заключил в тройные кавычки текст. Теперь мне не нужно использовать параметр data_files
или указывать какие-либо абсолютные пути. Я знаю, что делать его модулем Python некрасиво, но я считаю это менее уродливым, чем указание абсолютных путей.
Чтобы выполнить то, что вы описываете, потребуется два шага ...
Шаг 1. Чтобы добавить файл в исходный архив, включите его в МАНИФЕСТ
Создайте шаблон МАНИФЕСТ в папке, содержащей файл setup.py
МАНИФЕСТ - это в основном текстовый файл. со списком всех файлов, которые будут включены в исходный архив.
Вот как выглядит МАНИФЕСТ для моего проекта:
Примечание. Хотя sdist действительно добавляет некоторые файлы автоматически , я предпочитаю явно указывать их, чтобы быть уверенным, вместо того, чтобы предсказывать, что они делает и не делает.
Шаг 2: Чтобы установить файл данных в исходную папку, измените setup.py
Поскольку вы хотите добавить файл данных (LICENSE.txt) в исходную папку установки, вам необходимо изменить установку данных Путь к исходному пути установки. Это необходимо, потому что по умолчанию файлы данных устанавливаются в другое место, чем исходные файлы.
Чтобы изменить каталог установки данных, чтобы он соответствовал исходному каталогу установки ...
Получите информацию о каталоге установки из distutils с помощью:
from distutils.command.install import INSTALL_SCHEMES
Измените каталог установки данных, чтобы он соответствовал исходному каталогу установки:
for scheme in INSTALL_SCHEMES.values():
scheme['data'] = scheme['purelib']
И, добавьте файл данных и его местоположение в setup ():
data_files=[('', ['LICENSE.txt'])]
Примечание. Приведенные выше шаги должны выполнять в точности то, что вы описали стандартным способом, без использования каких-либо библиотек расширений.