Values von Funktion mit Parametern ersetzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
qwertiop27
User
Beiträge: 2
Registriert: Montag 2. Dezember 2019, 16:00

Eine blutige Anfängerfrage:
Gibt es bei Funktionen die Möglichkeit die Werte innerhalb der Paranthesis mit Parametern zu ersetzen und diese global zu definieren?

Es geht um eine vordefinierte Funktion die ich nicht bearbeiten kann, das sie in einem Skript steht, die immer geupdatet wird, aber deren Werte ich gerne global an einer Stelle definieren würde, da sie öfter vorkommt.

function(enabled=True, value_a=200, value_b=100)

Die Werte 100 und 200 würde ich gerne durch Parameter ersetzen, dass man dann nur noch den Parameter an einer Stelle definieren muss und nicht mehr an jeder Stelle wenn man die Funktion benutzt.

value_a = '200'
value_b = '100'

function(enabled=True, value_a, value_b)

Leider weiß ich nicht wie ich das programmiere muss, könnte mir das jemand weiterhelfen?
Ich bitte um Verzeihung wenn ich nicht immer die richtigen Begriffe benutzt habe.
Dank schonmal im Voraus <3
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der naheliegende Weg das zu tun besteht einfach darin, sich eine eigene Funktion zu machen, die das tut.

Code: Alles auswählen

def default_function(value_a=200, value_b=100, ...):
     function(value_a, value_b)
Dann benutzt du eben deine default_function, und das war's auch schon.

Alternativ kannst du mit functools partial arbeiten:

Code: Alles auswählen

default_function = functools.partial(function, value_a=100, value_b=200)
Nachteil daran ist, dass es jetzt nicht mehr moeglich ist, default_function mit etwas *anderem* aufzurufen fuer die festgezurrten Parameter. Das geht nur mit dem ersten Vorgehen.
qwertiop27
User
Beiträge: 2
Registriert: Montag 2. Dezember 2019, 16:00

Vielen lieben Dank für die schnelle Antwort!! Leider erhielt ich nun unterschiedliche Fehlermeldungen. Beim Verwenden von functools NameError, dass die Funktion nicht definiert wurde.

Vielleicht poste ich mal den echten Code, da ich nicht in der Lage bin, zu erklären wie die einzelnen Bausteine zusammenwirken.

Aus dem Hauptskript, die Funktion die unverändert bleiben soll:

Code: Alles auswählen

def set_relationship_bounds(
        self,
        enabled: bool = False,
        potency_ratio: float = None,
        delimit_by_numbers: bool = None,
        min_posts: int = None,
        max_posts: int = None,
        max_followers: int = None,
        max_following: int = None,
        min_followers: int = None,
        min_following: int = None,
    ):
        """Sets the potency ratio and limits to the provide an efficient
        activity between the targeted masses"""

        self.potency_ratio = potency_ratio if enabled is True else None
        self.delimit_by_numbers = delimit_by_numbers if enabled is True else None

        self.max_followers = max_followers
        self.min_followers = min_followers

        self.max_following = max_following
        self.min_following = min_following

        self.min_posts = min_posts if enabled is True else None
        self.max_posts = max_posts if enabled is True else None
Und hier das Skript, das die Funktion mit veränderten Werten benutzen soll:

Code: Alles auswählen

## logins
insta_username = '****'
insta_password = '****'

## restrictions global
default_function = functools.partial(function, enable=True, max_followers=10)


## create session
session = InstaPy(username=insta_username,
                  password=insta_password)

## session login
session.login()
with smart_run(session):

## restriction local
    session.default_function()
   
Danke erneut schon im Voraus für die Hilfe!
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@qwertiop27: Der Name `functools` existiert nur wenn man das Modul vorher importiert. Und einfach so `function` als erstes Argument zu schreiben geht natürlich auch nicht, da muss schon das Funktionsobjekt hin dessen Argumente partiell gebunden werden sollen. Da Du aber eine Methode hast, bräuchtest Du an der Stelle bereits ein Exemplar von dem Typ auf dem die Methode definiert ist.

Ganz ehrlich sehe ich auch nicht warum Du die Argumente nicht einfach ganz normal übergeben kannst. Definiert Dir halt in Deinem Programm Konstanten deren Werte dann beim Aufruf übergeben werden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten