Skip to content
Snippets Groups Projects
Commit e54b9809 authored by schwabmi's avatar schwabmi
Browse files

Merge branch 'master' of scm.cms.hu-berlin.de:ibi/python

parents c33df272 cd99804f
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
# 2. Hausaufgabe # 2. Hausaufgabe
Geben Sie diese Hausaufgabe gemeinsam mit Ihrem/r Partner/in ab. Füllen Sie dazu dieses Notebook aus und speichern Sie es ab (Disketten-Icon oben links). Laden Sie dann die Datei (hausaufgabe2_nachname1_nachname2.ipynb) in Moodle hoch. Verwenden Sie Kommentare im Python-Quellcode und Markdown-Textboxen im Jupyter-Notebook ([Syntax-Beispiele](https://de.wikipedia.org/wiki/Markdown#Auszeichnungsbeispiele)) um ihr Programm zu kommentieren. Geben Sie diese Hausaufgabe gemeinsam mit Ihrem/r Partner/in ab. Füllen Sie dazu dieses Notebook aus und speichern Sie es ab (Disketten-Icon oben links). Laden Sie dann die Datei (hausaufgabe2_nachname1_nachname2.ipynb) in Moodle hoch. Verwenden Sie Kommentare im Python-Quellcode und Markdown-Textboxen im Jupyter-Notebook ([Syntax-Beispiele](https://de.wikipedia.org/wiki/Markdown#Auszeichnungsbeispiele)) um ihr Programm zu kommentieren.
* Geben Sie bitte Ihrem **Notebook einen Namen**, sodass es Ihnen und Ihrem Partner zugeordnet werden kann (z.B. *hausaufgabe2_nachname1_nachname2.ipynb*) * Geben Sie bitte Ihrem **Notebook einen Namen**, sodass es Ihnen und Ihrem Partner zugeordnet werden kann (z.B. *hausaufgabe2_nachname1_nachname2.ipynb*)
* Fügen Sie außerdem **Kommentare** zu ihrem Code hinzu, mit denen Sie erklären, was die Funktion macht. Dies kann man durch zwei Varianten machen: * Fügen Sie außerdem **Kommentare** zu ihrem Code hinzu, mit denen Sie erklären, was die Funktion macht. Dies kann man durch zwei Varianten machen:
- inline-Kommentare (Code kommentieren): `#` - inline-Kommentare (Code kommentieren): `#`
- Docstrings (Beschreibung der Funktion): `''' '''` - Docstrings (Beschreibung der Funktion): `''' '''`
* In jedem Codeblock steht ein **Funktionsaufruf**, der die von Ihnen definierte Funktion aufruft. Dies sollte funktionieren (dort kann man auch direkt ablesen, wieviele und welche Argumente benötigt werden). Anfangs können Sie den Aufruf gerne auskommentieren, damit nicht ständig eine Fehlermeldung angezeigt wird. * In jedem Codeblock steht ein **Funktionsaufruf**, der die von Ihnen definierte Funktion aufruft. Dies sollte funktionieren (dort kann man auch direkt ablesen, wieviele und welche Argumente benötigt werden). Anfangs können Sie den Aufruf gerne auskommentieren, damit nicht ständig eine Fehlermeldung angezeigt wird.
* Schreiben Sie bitte zu jeder definierten Funktion **einen Funktionsaufruf mit eigens definierten *turtle-Objekten* und Parametern**. * Schreiben Sie bitte zu jeder definierten Funktion **einen Funktionsaufruf mit eigens definierten *turtle-Objekten* und Parametern**.
* Nutzen Sie **Schleifen** in allen Aufgaben, in denen Sie geometrische Figuren zeichnen müssen (Sie haben diese in den Seminaren kennengelernt)! * Nutzen Sie **Schleifen** in allen Aufgaben, in denen Sie geometrische Figuren zeichnen müssen (Sie haben diese in den Seminaren kennengelernt)!
* Verwenden Sie die von Ihnen **geschriebenen Funktionen aus vorherigen Aufgabenteilen in den Folgeaufgaben**, um Code zu sparen und Fehler zu vermeiden (zum Beispiel die Nutzung der Funktion `triangle` aus Aufgabe 1 in den Aufgaben 2-5). * Verwenden Sie die von Ihnen **geschriebenen Funktionen aus vorherigen Aufgabenteilen in den Folgeaufgaben**, um Code zu sparen und Fehler zu vermeiden (zum Beispiel die Nutzung der Funktion `triangle` aus Aufgabe 1 in den Aufgaben 2-5).
* Nutzen Sie Funktionen des turtle-Moduls (siehe https://docs.python.org/3/library/turtle.html). * Nutzen Sie Funktionen des turtle-Moduls (siehe https://docs.python.org/3/library/turtle.html).
* Bitte geben Sie nur **eine Lösung pro Aufgabe** ab. * Bitte geben Sie nur **eine Lösung pro Aufgabe** ab.
Wir wünschen viel Erfolg beim Lösen der Aufgaben! Wir wünschen viel Erfolg beim Lösen der Aufgaben!
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Hilfsfunktion: ### Hilfsfunktion:
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` ```
from random import randint from random import randint
def setcolor(): def setcolor():
"""generiert eine zufällige rgb-Farbe""" """generiert eine zufällige rgb-Farbe"""
return (randint(0,255),randint(0,255),randint(0,255)) return (randint(0,255),randint(0,255),randint(0,255))
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` ```
# Beispielcode zur Hilfsfunktion # Beispielcode zur Hilfsfunktion
import turtle import turtle
# wichtig ist es, bei Jupyter Notebook die folgende Codezeile anzugeben, # wichtig ist es, bei Jupyter Notebook die folgende Codezeile anzugeben,
# um mit rgb Farbcodes zu arbeiten. # um mit rgb Farbcodes zu arbeiten.
# In der Sandbox bitte die Zeile weglassen. # In der Sandbox bitte die Zeile weglassen.
turtle.colormode(255) turtle.colormode(255)
caro = turtle.Turtle() caro = turtle.Turtle()
for i in range(4): for i in range(4):
caro.fd(100) caro.fd(100)
caro.lt(90) caro.lt(90)
caro.color(setcolor()) caro.color(setcolor())
turtle.mainloop() turtle.mainloop()
turtle.bye() turtle.bye()
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Tipps für die folgenden Aufgaben: ### Tipps für die folgenden Aufgaben:
Nutzen Sie die python-Dokumention von `turtle`: https://docs.python.org/3/library/turtle.html. Dort finden Sie alle Funktionen, die Sie anwenden können. Wichtig für die Hausaufgabe sind (neben denen, die Sie schon kennengelernt haben): Nutzen Sie die python-Dokumention von `turtle`: https://docs.python.org/3/library/turtle.html. Dort finden Sie alle Funktionen, die Sie anwenden können. Wichtig für die Hausaufgabe sind (neben denen, die Sie schon kennengelernt haben):
- `t.shape('turtle')`: ändert die Gestalt der "Schildkröte" in eine Schildkröte. - `t.shape('turtle')`: ändert die Gestalt der "Schildkröte" in eine Schildkröte.
- Die Farbe der Schildkröte und der Färbung der Muster wählt man mit `t.color()`. - Die Farbe der Schildkröte und der Färbung der Muster wählt man mit `t.color()`.
- ```t.begin_fill() - ```t.begin_fill()
... ...
t.end_fill()```: Färbt das Muster, was die Schildkröte zwischen den beiden Anweisungen gezeichnet hat, ein. t.end_fill()```: Färbt das Muster, was die Schildkröte zwischen den beiden Anweisungen gezeichnet hat, ein.
- `t.stamp()`: Platziert bei Aufruf eine Schildkröte an der Stelle, an der die Schildkröte sich zu diesem Zeitpunkt befindet. - `t.stamp()`: Platziert bei Aufruf eine Schildkröte an der Stelle, an der die Schildkröte sich zu diesem Zeitpunkt befindet.
- Mit `t.speed()` können Sie der turtle verschiedene Geschwindigkeiten geben. - Mit `t.speed()` können Sie der turtle verschiedene Geschwindigkeiten geben.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## Aufgaben ## Aufgaben
### Aufgabe 1 ### Aufgabe 1
Schreiben Sie eine Funktion `triangle`, die zwei Parameter `t` und `l` erwartet. `t` ist ein turtle-Objekt, `l` eine Ganzzahl. Die Funktion soll die Schildkröte nutzen, um ein gleichseitiges Dreieck mit Seitenlänge `l` zu zeichnen. Schreiben Sie einen Funktionsaufruf, der `otto` und `40` an `triangle` übergibt und rufen Sie ihr Programm auf. Schreiben Sie eine Funktion `triangle`, die zwei Parameter `t` und `l` erwartet. `t` ist ein turtle-Objekt, `l` eine Ganzzahl. Die Funktion soll die Schildkröte nutzen, um ein gleichseitiges Dreieck mit Seitenlänge `l` zu zeichnen. Schreiben Sie einen Funktionsaufruf, der `otto` und `40` an `triangle` übergibt und rufen Sie ihr Programm auf.
Vervollständigen Sie ihren Code: Vervollständigen Sie ihren Code:
- Färben Sie die Schildkröte in einer Farbe Ihrer Wahl. - Färben Sie die Schildkröte in einer Farbe Ihrer Wahl.
- Färben Sie Ihr Dreieck in einer Farbe Ihrer Wahl. - Färben Sie Ihr Dreieck in einer Farbe Ihrer Wahl.
- Platzieren Sie an jeder Ecke Ihres Dreiecks eine Schildkröte. - Platzieren Sie an jeder Ecke Ihres Dreiecks eine Schildkröte.
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` ```
import turtle import turtle
turtle.colormode(255) turtle.colormode(255)
def triangle(t, l): def triangle(t, l):
pass # löschen Sie diese Zeile, wenn Sie anfangen, die Funktion zu implementieren pass # löschen Sie diese Zeile, wenn Sie anfangen, die Funktion zu implementieren
otto = turtle.Turtle() otto = turtle.Turtle()
triangle(otto, 100) triangle(otto, 100)
turtle.mainloop() turtle.mainloop()
turtle.bye() turtle.bye()
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Aufgabe 2 ### Aufgabe 2
Schreiben Sie eine Funktion `repeat_triangle`, die `n` gleichseitige Dreiecke nebeneinander zeichnet. Sie soll drei Argumente `t`, `n` und `l` erhalten. `t` ist ein turtle-Objekt, `l` gibt die Seitenlänge der Dreiecke an und `n` die Anzahl der Dreiecke. Die Farbe der Dreiecke soll nicht schwarz sein. In der Funktion `repeat_triangle` soll die Funktion `triangle` aus Aufgabe 1 genutzt werden. <br> Schreiben Sie eine Funktion `repeat_triangle`, die `n` gleichseitige Dreiecke nebeneinander zeichnet. Sie soll drei Argumente `t`, `n` und `l` erhalten. `t` ist ein turtle-Objekt, `l` gibt die Seitenlänge der Dreiecke an und `n` die Anzahl der Dreiecke. Die Farbe der Dreiecke soll nicht schwarz sein. In der Funktion `repeat_triangle` soll die Funktion `triangle` aus Aufgabe 1 genutzt werden. <br>
- *freiwillig* : Jedes Dreieck soll eine eigene Farbe haben. - *freiwillig* : Jedes Dreieck soll eine eigene Farbe haben.
Eine mögliche Lösung könnte so aussehen (`repeat_triangle(otto, 80, 4)`): Eine mögliche Lösung könnte so aussehen (`repeat_triangle(otto, 80, 4)`):
![repeat](https://box.hu-berlin.de/f/7ceeb79b004e4e9f8ab5/?dl=1) ![repeat](https://box.hu-berlin.de/f/7ceeb79b004e4e9f8ab5/?dl=1)
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` ```
import turtle import turtle
turtle.colormode(255) turtle.colormode(255)
# Aufgabe a # Aufgabe a
def repeat_triangle(t, l, n): def repeat_triangle(t, l, n):
pass # löschen Sie diese Zeile, wenn Sie anfangen, die Funktion zu implementieren pass # löschen Sie diese Zeile, wenn Sie anfangen, die Funktion zu implementieren
otto = turtle.Turtle() otto = turtle.Turtle()
repeat_triangle(otto, 80, 4) repeat_triangle(otto, 80, 4)
turtle.mainloop() turtle.mainloop()
turtle.bye() turtle.bye()
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Aufgabe 3 ### Aufgabe 3
Schreiben Sie eine Funktion `pile_triangle`, die `m` gleichseitige Dreiecke übereinander zeichnet. Sie soll drei Argumente `t`, `l` und `m` erhalten. `t` ist ein turtle-Objekt, `l` gibt die Seitenlänge der Dreiecke an und `m` die Anzahl der Dreiecke. Die Farbe der Dreiecke soll nicht schwarz sein. In der Funktion `pile_triangle` soll die Funktion `triangle` aus Aufgabe 1 genutzt werden. Schreiben Sie eine Funktion `pile_triangle`, die `m` gleichseitige Dreiecke übereinander zeichnet. Sie soll drei Argumente `t`, `l` und `m` erhalten. `t` ist ein turtle-Objekt, `l` gibt die Seitenlänge der Dreiecke an und `m` die Anzahl der Dreiecke. Die Farbe der Dreiecke soll nicht schwarz sein. In der Funktion `pile_triangle` soll die Funktion `triangle` aus Aufgabe 1 genutzt werden.
**Achtung**: Im gleichseitigen Dreieck ist die Höhe des Dreiecks gleich die halbe Seitenlänge multipliziert mit der Wurzel aus Drei. **Achtung**: Im gleichseitigen Dreieck ist die Höhe des Dreiecks gleich die halbe Seitenlänge multipliziert mit der Wurzel aus Drei.
- *frewillig* : Jedes Dreieck soll eine eigene Farbe haben. - *frewillig* : Jedes Dreieck soll eine eigene Farbe haben.
Eine mögliche Lösung könnte so aussehen (`pile_triangle(otto, 80, 4)`): Eine mögliche Lösung könnte so aussehen (`pile_triangle(otto, 80, 4)`):
![pile](https://box.hu-berlin.de/f/d6c490e2f4f640349f42/?dl=1) ![pile](https://box.hu-berlin.de/f/d6c490e2f4f640349f42/?dl=1)
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` ```
import turtle import turtle
turtle.colormode(255) turtle.colormode(255)
# Aufgabe a # Aufgabe a
def pile_triangle(t, l, m): def pile_triangle(t, l, m):
pass # löschen Sie diese Zeile, wenn Sie anfangen, die Funktion zu implementieren pass # löschen Sie diese Zeile, wenn Sie anfangen, die Funktion zu implementieren
otto = turtle.Turtle() otto = turtle.Turtle()
pile_triangle(otto, 80, 4) pile_triangle(otto, 80, 4)
turtle.mainloop() turtle.mainloop()
turtle.bye() turtle.bye()
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Aufgabe 4 ### Aufgabe 4
Schreiben Sie eine Funktion `tiled_triangle`, die `n` gleicheitige Dreiecke nebeneinander und `m` gleichseitige Dreiecke übereinander zeichnet. Sie soll vier Argumente `t`, `l`, `n` und `m` erhalten. `t` ist ein turtle-Objekt, `l` gibt die Seitenlänge der Dreiecke an, `n` die Anzahl der nebeneinanderliegenden Dreiecke und `m` die Anzahl der übereinanderliegenden Dreiecke. Die Farbe der Dreiecke soll nicht schwarz sein. Nutzen Sie dafür Ihre Lösung aus Aufgabe Aufgabe 3 **oder** Aufgabe 4. <br> Schreiben Sie eine Funktion `tiled_triangle`, die `n` gleicheitige Dreiecke nebeneinander und `m` gleichseitige Dreiecke übereinander zeichnet. Sie soll vier Argumente `t`, `l`, `n` und `m` erhalten. `t` ist ein turtle-Objekt, `l` gibt die Seitenlänge der Dreiecke an, `n` die Anzahl der nebeneinanderliegenden Dreiecke und `m` die Anzahl der übereinanderliegenden Dreiecke. Die Farbe der Dreiecke soll nicht schwarz sein. Rufen Sie entweder die Funktion `repeat_triangle` aus Aufgabe 2 oder `pile_triangle` in Ihrer Funktion `tiled_triangle` auf. <br>
- *freiwillig* : Jedes Dreieck soll eine eigene Farbe haben. - *freiwillig* : Jedes Dreieck soll eine eigene Farbe haben.
- *freiwillig* : Färben Sie auch die Zwischenräume, die hier entstehen - *freiwillig* : Färben Sie auch die Zwischenräume, die hier entstehen
Eine mögliche Lösung könnte so aussehen (`tiled_triangle(otto, 80, 3, 3)`): Eine mögliche Lösung könnte so aussehen (`tiled_triangle(otto, 80, 3, 3)`):
![tiled](https://box.hu-berlin.de/f/811e98f587e040098a83/?dl=1) ![tiled](https://box.hu-berlin.de/f/811e98f587e040098a83/?dl=1)
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` ```
import turtle import turtle
turtle.colormode(255) turtle.colormode(255)
def tiled_triangle(t, l, n, m): def tiled_triangle(t, l, n, m):
pass # löschen Sie diese Zeile, wenn Sie anfangen, die Funktion zu implementieren pass # löschen Sie diese Zeile, wenn Sie anfangen, die Funktion zu implementieren
otto = turtle.Turtle() otto = turtle.Turtle()
tiled_triangle(otto, 80, 3, 3) tiled_triangle(otto, 80, 3, 3)
turtle.mainloop() turtle.mainloop()
turtle.bye() turtle.bye()
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Aufgabe 5 ### Aufgabe 5
Stellen Sie sich vor, sie müssen `tiled_triangle` so verändern, dass die Funktion ein zusätzliches Argument erhält, nämlich die Anzahl der Ecken. (`tiled_triangle(t,l,n,m,ecken)`) Die geometrische Form (bis jetzt das Dreieck) soll also in Zukunft verallgemeinert werden. **Die Funktion selbst müssen Sie nicht schreiben.** An welchen Stellen könnte es aber Schwierigkeiten in Ihrer jetzigen Funktion geben? Stellen Sie sich vor, sie müssen `tiled_triangle` so verändern, dass die Funktion ein zusätzliches Argument erhält, nämlich die Anzahl der Ecken. (`tiled_triangle(t,l,n,m,ecken)`) Die geometrische Form (bis jetzt das Dreieck) soll also in Zukunft verallgemeinert werden. **Die Funktion selbst müssen Sie nicht schreiben.** An welchen Stellen könnte es aber Schwierigkeiten in Ihrer jetzigen Funktion geben?
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
- -
- -
- -
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Aufgabe 6 ### Aufgabe 6
Überraschen Sie mich. Seien Sie **kreativ** und malen Sie mit `turtle`, auf was Sie Lust haben :) Überraschen Sie mich. Seien Sie **kreativ** und malen Sie mit `turtle`, auf was Sie Lust haben :)
Es gibt einige Vorgaben, die im Code enthalten sein müssen: Es gibt einige Vorgaben, die im Code enthalten sein müssen:
- entweder eine **Schleife** oder eine **Rekursion** - entweder eine **Schleife** oder eine **Rekursion**
- mindestens eine **if/elif/else-Bedingung** - mindestens eine **if/elif/else-Bedingung**
- der Code muss in mindestens zwei **Funktionen** verkapselt sein. - der Code muss in mindestens zwei **Funktionen** verkapselt sein.
Kommentieren Sie Ihren Code. Kommentieren Sie Ihren Code.
PS: Entweder schauen Sie in den Notebooks nach oder Sie nutzen Google, um sich zu inspirieren: `google python turtle drawings`. PS: Entweder schauen Sie in den Notebooks nach oder Sie nutzen Google, um sich zu inspirieren: `google python turtle drawings`.
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` ```
# Hier soll ihr Code stehen # Hier soll ihr Code stehen
``` ```
......
%% Cell type:markdown id:1fe95632 tags:
# Ein Python-Modul entwicklen und veröffentlichen
<br/>
<br/>
Dieses Notebook finden Sie hier: https://scm.cms.hu-berlin.de/ibi/python/-/blob/master/programmierspass/Develop_and_publish_modul.ipynb
<br/>
![CC-BY-NC](https://scm.cms.hu-berlin.de/ibi/python/-/raw/master/img/cc-by-nc.png)
Dieses Notebook ist als freies Werk unter der Lizenz [Creative Commons Attribution-NonCommercial 3.0 Unported](http://creativecommons.org/licenses/by-nc/3.0/) verfügbar. Sie dürfen die Inhalte kopieren, verteilen und verändern, solange Sie die Urheber nennen und sie nicht für kommerzielle Zwecke nutzen.
%% Cell type:markdown id:c7dc7204 tags:
## Was ist ein Modul?
- Ein Modul ist eine Datei, die Python-Definitionen und -Anweisungen beinhaltet. Oder anders gesagt: Jede Python-Datei ist ein Modul und der Name des Moduls ist der Dateiname ohne die Endung `.py`
- Ein Package ist eine Sammlung von Modulen. Hierfür liegen mehrere Module in einem Ordner, welcher auch eine Datei `__init__.py` enthalten muss. Dies unterscheidet ein Package von einem Ordner, der zufällig mehrere Module enthält.
%% Cell type:markdown id:21e7cd83 tags:
## Module verwenden
- Python wird mit einer Bibliothek von Standardmodulen ausgeliefert. Ein solches Modul kann mit dem Befehl `import` importiert und anschließend verwendet weden.
%% Cell type:code id:94cad5e7 tags:
```
import json
```
%% Cell type:markdown id:1129c831 tags:
- Wenn wir nun versuchen ein Modul zu installieren, welches nicht in den Standardmodulen enthalten ist, dann kommt es zu einer Fehlermeldung.
%% Cell type:code id:3aa3db5d tags:
```
import pandas
```
%% Cell type:markdown id:bdc84dcf tags:
## Module installieren
- Module, die nicht in der Bibliothek von Standardmodulen enthalten sind, müssen vor dem Import installiert werden. Hierfür wird ein Paketverwaltungsprogramm verwendet. Dies ist im Normfall `pip`. Mit dem Befehl `pip install` können Pakete installiert werden.
%% Cell type:code id:2148e19b tags:
```
!pip install pandas
```
%% Cell type:markdown id:2dce18c9 tags:
## Doch was passiert hier eigentlich?
%% Cell type:markdown id:f07907eb tags:
### Python Package Index (PyPI)
- `pip`lädt Pakete aus dem Python Package Index (PyPI).
- PyPI ist ein Sofware-Vezeichnis der Programmiersprache Python.
- PyPI umfasst knapp 420.00 Projekte (Stand: Dezember 2022)
- Jede:r kann sich auf PyPI (https://pypi.org) registrieren und ein Projekt erstellen.
<div class="alert alert-info">
<b>Hinweis</b> Der Begriff "Package" kann etwas verwirrend sein. PyPI spricht auch von Packages. Ein PyPI-Package kann ein einzelnes Python-Modul sein oder aber auch mehrere Python-Packages umfassen.
</div>
%% Cell type:markdown id:d45b9900 tags:
### PyPI Testumgebung
- Für Testzwecke gibt es die PyPI Testumgebgung (https://test.pypi.org)
- Diese funktioniert genau wie die reale Version und sollte verwendet werden um die eigene Konfiguration zu testen.
%% Cell type:markdown id:cbf98fba tags:
## Mein erstes PyPI (Test)-Package
%% Cell type:markdown id:0cbf8602 tags:
### Beispiel für ein minimales Projekt
```
pypi-example/
├── LICENSE
├── pyproject.toml
├── README.md
└── pypiex/
├── __init__.py
└── example.py
```
%% Cell type:markdown id:8b3f6ddf tags:
### pyproject.toml - Konfiguration von Metadaten
```toml
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "Pypiex"
version = "0.0.1"
authors = [
{ name = "Frederik Arnold", email = "frederik.arnold@hu-berlin.de" }
]
description = "Eine kurze Beschreibung für PyPiex"
readme = "README.md"
requires-python = ">=3.7"
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: Apache Software License",
"Operating System :: OS Independent",
]
[project.urls]
"Homepage" = "https://..."
"Bug Tracker" = "https://..."
```
- Weitere Informationen zu den einzelnen Angaben: https://packaging.python.org/en/latest/specifications/declaring-project-metadata/#declaring-project-metadata
%% Cell type:markdown id:927e9459 tags:
### README.md
```
# Mein Projekt
Dies ist ein Beispielprojekt.
```
%% Cell type:markdown id:4c8acd0d tags:
### LICENSE
```
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
[...]
```
%% Cell type:markdown id:d4b197a7 tags:
### Package für den Upload erzeugen
- Für die Erzeugung der zum Upload benötigten Dateien, muss zuerst in den Projektordner navigiert werden, und dort die folgende Befehle ausgeführt werden.
%% Cell type:markdown id:68e05d16 tags:
- Zuerst müssen für den Build benötigten Pakete installiert werden.
```
pip install --upgrade build
```
%% Cell type:markdown id:3cf7b4cd tags:
- Dann kann anhand der `pyproject.toml` das Package erstellt werden. Dieses wird in den Ordner `dist` im Projektordner gespeichert.
```
python -m build
```
%% Cell type:markdown id:afd1c91e tags:
- Wenn die Befehle korrekt ausgeführt werden konnten, dann sollte die letzte Zeile so lauten:
```
Successfully built xyz-version.tar.gz and xyz-version-py3-none-any.whl
```
- Außerdem sollten zwei Dateien im Ordner `dist` erzeugt worden sein. Es gibt verschiedene Arten von Packages.
- Die Datei mit der Endung `.tar.gz` ist eine Source Distribution.
- Die Datei mit der Endung `.whl` (Wheel-Datei) ist eine Built Distribution. Dieses Format ist neuer und hat verschiedene Vorteile. Die Details sind an dieser Stelle nicht relevant.
%% Cell type:markdown id:a87cd03e tags:
### Package auf den Testserver hochladen
- Um Pakete hochladen zu können muss zuerst ein Account erstellt werden.
<div class="alert alert-info">
<b>Hinweis</b> Der PyPI Testserver ist unabhängig von der Produktionsumgebung und es werden jeweils eigene Accounts benötigt.
</div>
%% Cell type:markdown id:1444d33a tags:
- Jetzt muss ein `API token` generiert werden. Dies geschieht in den Kontoeinstellungen im Bereich `API-Token`. Folgender Link führt automatisch dort hin: https://test.pypi.org/manage/account/#api-tokens. Auf `API-Token hinzufügen` klicken. Dort einen sinnvollen Namen vergeben und den Geltungsbereich auf `Gesamtes Konto` stellen.
<div class="alert alert-info">
<b>Hinweis</b> Ein erstelltes Token muss direkt gesichert werden, da es danach nicht mehr einsehbar ist.
</div>
%% Cell type:markdown id:abf06326 tags:
- Jetzt die für den Upload benötigten Packages laden und installieren:
```
pip install --upgrade twine
```
%% Cell type:markdown id:325e2694 tags:
- Und dann den Upload ausführen. Hierbei wird nach dem Username und Passwort gefragt. Für den Username muss `__token__` verwendet werden und für Passwort das gerade erstelle Token inklusive des `pypi` Prefix.
```
python -m twine upload --repository testpypi dist/*
```
<div class="alert alert-info">
<b>Hinweis</b> Soll eine neue Version für ein Paket hochgeladen werden, dann muss vor der Erzeugung des Pakets immer zuerst die Versionsnummer in der `pyproject.toml` angepasst werden. Eine Version kann immer nur ein Mal hochgeladen werden.
</div>
%% Cell type:markdown id:a55a2eb7 tags:
## Package installieren und verwenden
- Das Paket kann jetzt mit `pip` installiert werden. Hierzu muss der Testserver angegeben werden.
%% Cell type:code id:eab699f8 tags:
```
!pip install --index-url https://test.pypi.org/simple/ --no-deps Pypiex
```
%% Cell type:code id:2f369bf9 tags:
```
from pypiex import example
example.say_hello("Frederik")
```
%% Cell type:markdown id:2a17f85c tags:
## Literatur
- https://packaging.python.org/en/latest/tutorials/packaging-projects/
- https://setuptools.pypa.io/en/latest/userguide/index.html
%% Cell type:code id:ee4663eb tags:
```
```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment