Вероятно, лучший способ сделать это - использовать директиву 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
имен пакетов ( empty = all packages) в список шаблонов (может включать в себя глобусы). Например, если вы хотите указывать только файлы внутри своего пакета, вы также можете это сделать:
package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}
Решение здесь, безусловно, , а не , чтобы переименовать ваш py
] с расширением .py
.
Для получения дополнительной информации см. презентацию Ian Bicking .
Другой подход, который хорошо работает, если вы просто хотите контролировать содержимое исходного дистрибутива (sdist
) и иметь файлы за пределами пакета (например, каталог верхнего уровня), - это добавить файл MANIFEST.in
. См. документацию Python для формата этого файла.
С момента написания этого ответа я обнаружил, что использование MANIFEST.in
, как правило, менее отвратительный подход, чтобы убедиться, что ваш источник дистрибутив (tar.gz
) имеет нужные файлы.
Например, если вы хотите включить requirements.txt
с верхнего уровня, рекурсивно включить каталог «данных» верхнего уровня:
include requirements.txt
recursive-include data *
Тем не менее, для того, чтобы эти файлы, которые будут скопированы во время установки в папку пакета внутри пакетов сайта, вам нужно будет предоставить include_package_data=True
функции setup()
. См. Добавление некодовых файлов для получения дополнительной информации.
Вы сравниваете два элемента типа a
, используя ==
. Это означает, что a
не может быть просто любым типом - это должен быть экземпляр Eq
, так как тип ==
равен (==) :: Eq a => a -> a -> Bool
.
Это можно исправить, добавив ограничение Eq
в a
к сигнатуре типа вашей функции:
isPalindrome :: Eq a => [a] -> Bool
Кстати, есть гораздо более простой способ реализации эта функция использует reverse
.