Funkcje w Pythonie - argumenty

0

Hej mam taka funkcje w Pythonie:

def fun(a, b, dzialanie = "suma", **kwargs):
    if dzialanie == "suma":
        return a + b
    else: return c - d

Chcialbym aby dzialala w ten sposob ze moge podac tylko a i b i bedzie wykonywala sie suma (czyli to jest OK bo dziala) ale w niektorych przypadkach chcialbym podac tez argumenty c i d i gdy wpisze inne dzialanie niz suma chcialbym zeby wykonala sie roznica na wprowadzonych przeze mnie argumentach. Niestety nie dziala to tak jakbym chcial, gdyz gdy wywyluje funkcje w ten sposob

c = 4
d = 7
fun(1, 2, dzialanie = "odejmowanie", c = 4, d = 6)

to dzialanie wykonuje sie na liczbach podanych przed wywolaniem funkcji a nie na tych podanych przeze mnie w funkcji. Moze nie do konca rozumiem jak dzialaja funkcje ale prosilbym o pomoc co powinienem zmienic :D Bo to jest tylko przyklad a ogolnie chce pisac bardziej zaawansowane funkcje i nie zawsze chce podawac wszystkie argumenty :)

1

def fun(a, b, dzialanie = "suma", **kwargs):
    if dzialanie == "suma":
        return a + b
    else: return c - d

A skad tutaj wziales niby d i c? Przeciez to nie sa argumenty funkcji :) Odpowiedz: domkniecie przechwycilo je z zewnetrznego scope'a ale dla tej funkcji to juz stale.

0

@stivens: No właśnie miałem nadzieje że to **kwargs to zrobi :D W sensie chce zrobic cos takiego ze nie musze wpisywac c i d jesli dzialanie = suma, natomaist jesli wpisze cos innego niz suma to chcialbym podac c i d i wtedy zeby na tych wprowadzonych liczbach mi sie wykonywal kod. Bo bedzie to jedna funkcja w ktorej w zaleznosci od podania dzialania bedzie sie wykonywala inna instrukcja. Jesli podaje dzialanie rozne od suma to wiem ze funkcja bedzie potrzebowala c i d wiec chialbym zebym dopiero w takim przypadku musial podawac te wartosci. Wiem ze moge definiujac funkcje od razu napisac def fun(a, b, dzialanie = "suma", c = 0, d =0): ale jesli tych dzialan mialbym duzo to i argumentow byloby duze (a zalezy mi na tym zeby kazdy argument mial inna nazwe) wiec myslalem ze da sie to jakos sprytnie wykombinowac

2

Czyli uprawiasz czarna magie? ;)

Musisz sobie to wyjac z kwargs explicite.

Ale w tym przypadku wystarczy c = None, d = None.

I musze zaznaczyc, ze to co robisz jest generalnie zla praktyka.

1

Dobra to ogolnie to na 90% jest https://en.m.wikipedia.org/wiki/XY_problem

Co chcesz osiagnac dlugofalowo?


Update: strzelam ze potrzebujesz https://en.m.wikipedia.org/wiki/Interpreter_pattern

0

@stivens: Dzięki, z tym None działa jak należy :) Nie jestem wybornym programistą a potrzebowałem tej funkcjonalności żeby w kodzie móc po prostu zmienić fragment poprzez prostą zmianę argumentów w konkretnym miejscu w kodzie :)

0

Czytales o tym interpreterze? :)

0

@stivens: W sensie o tworzeniu klas itp? Klasy dopiero poznaje i do tego projektu wystarczy mi ta funkcjonalnosc ktora dysponuje do tej pory :D

1

No dobrze. Rozumiem. Tylko zapamietaj ze tak sie nie robi :p

1

Uprzedzam zamiast 1 funkcję do realizacji N działań. Lepiej 1 funkcja na 1 działanie.

Czyli zamiast tajemniczej funkcji "fun"

def fun(a, b, dzialanie = "suma", **kwargs):
    if dzialanie == "suma":
        return a + b
    else: return c - d

Lepsze i prostsze będą:

def suma(a, b):
    return a + b

def roznica(a, b):
    return a - b

1 użytkowników online, w tym zalogowanych: 0, gości: 1