Ik'heb Python scripts gemaakt voor eenvoudige taken op het werk en nooit echt de moeite genomen om ze te verpakken voor anderen om te gebruiken. Nu heb ik de opdracht gekregen om een Python wrapper te maken voor een REST API. Ik heb absoluut geen idee hoe ik moet beginnen en ik heb hulp nodig.
Wat ik heb:
(Wil gewoon zo specifiek mogelijk zijn) Ik heb de virtualenv klaar, het's ook up in github, het .gitignore bestand voor python is er ook, plus, de requests library voor interactie met de REST API. Dat's het.
Hier's de huidige mapstructuur
.
├── bin
│ └── /the usual stuff/
├── include
│ └── /the usual stuff/
├── lib
│ └── python2.7
│ └── /the usual stuff/
├── local
│ └── /the usual stuff/
└── README.md
27 directories, 280 files
Ik weet niet eens waar ik de .py bestanden moet zetten, als ik er ooit een maak.
Wat ik wilde doen:
Een python module installeerbaar maken met "pip install ..."
Indien mogelijk, wil ik een algemeen stap voor stap proces over het schrijven van Python modules.
Een module is een bestand met Python definities en verklaringen. De bestandsnaam is de naam van de module met het achtervoegsel .py
Maak hello.py
en schrijf de volgende functie als inhoud:
def helloworld():
print "hello"
Dan kun je hello
importeren:
>>> import hello
>>> hello.helloworld()
'hello'
>>>
Om veel .py
bestanden te groeperen zet je ze in een map. Elke map met een __init__.py
wordt door python beschouwd als een module en je kunt ze een pakket noemen
|-HelloModule
|_ __init__.py
|_ hellomodule.py
Je kunt op de gebruikelijke manier met het import statement op je module omgaan.
Voor meer informatie, zie 6.4. Pakketten.
Python 3 - UPDATED 18th November 2015
Vond het geaccepteerde antwoord nuttig, maar wilde toch een aantal punten uitbreiden ten voordele van anderen op basis van mijn eigen ervaringen.
Module: Een module is een bestand met Python-definities en -verklaringen. De bestandsnaam is de naam van de module met het achtervoegsel .py er aan toegevoegd.
Module Voorbeeld: Veronderstel dat we een enkel python script hebben in de huidige directory, hier noem ik het mymodule.py
Het bestand mymodule.py bevat de volgende code:
def myfunc():
print("Hello!")
Als we de python3 interpreter uitvoeren vanuit de huidige directory, kunnen we de functie myfunc op de volgende verschillende manieren importeren en uitvoeren (u zou typisch slechts één van de volgende kiezen):
>>> import mymodule
>>> mymodule.myfunc()
Hello!
>>> from mymodule import myfunc
>>> myfunc()
Hello!
>>> from mymodule import *
>>> myfunc()
Hello!
Ok, dus dat was gemakkelijk genoeg.
Veronderstel nu dat je deze module in zijn eigen specifieke map wil plaatsen om een module namespace te voorzien, in plaats van hem ad-hoc te draaien vanuit de huidige werkdirectory. Dit is waar het de moeite waard is om het concept van een pakket uit te leggen.
Pakket: Packages zijn een manier om Python's module namespace te structureren door gebruik te maken van "dotted module names". Bijvoorbeeld, de module naam A.B geeft een submodule aan met de naam B in een pakket met de naam A. Net zoals het gebruik van modules de auteurs van verschillende modules voorkomt dat ze zich zorgen moeten maken over elkaars globale variabele namen, voorkomt het gebruik van gestippelde module namen dat de auteurs van multi-module pakketten zoals NumPy of de Python Imaging Library zich zorgen moeten maken over elkaars module namen.
Pakket Voorbeeld: Laten we nu eens aannemen dat we de volgende map en bestanden hebben. Hier is mymodule.py identiek aan de vorige, en init.py is een leeg bestand:
.
└── mypackage
├── __init__.py
└── mymodule.py
De init.py bestanden zijn nodig om ervoor te zorgen dat Python de mappen behandelt als mappen die pakketten bevatten. Voor meer informatie, zie de Modules documentatie link verderop in dit artikel.
Onze huidige werkdirectory is één niveau boven de gewone map genaamd mypackage
$ ls
mypackage
Als we nu de python3 interpreter starten, kunnen we de module mymodule.py die de vereiste functie myfunc bevat op de volgende verschillende manieren importeren en uitvoeren (normaal gesproken zou je gewoon een van de volgende kiezen):
>>> import mypackage
>>> from mypackage import mymodule
>>> mymodule.myfunc()
Hello!
>>> import mypackage.mymodule
>>> mypackage.mymodule.myfunc()
Hello!
>>> from mypackage import mymodule
>>> mymodule.myfunc()
Hello!
>>> from mypackage.mymodule import myfunc
>>> myfunc()
Hello!
>>> from mypackage.mymodule import *
>>> myfunc()
Hello!
Uitgaande van Python 3, is er uitstekende documentatie te vinden op: Modules
Wat betreft naamgevingsconventies voor pakketten en modules, worden de algemene richtlijnen gegeven in PEP-0008 - zie Package and Module Names
Modules moeten korte namen hebben, allemaal kleine letters. Underscores kunnen gebruikt worden in de naam van de module indien dit de leesbaarheid verbetert. Python packages moeten ook korte namen hebben, allemaal kleine letters, hoewel het gebruik van underscores wordt ontmoedigd.