Python: Argument till funktion med condition - behöver hjälp

Permalänk
Medlem

Python: Argument till funktion med condition - behöver hjälp

Hoppas någon har en lösning till följande problem i Python 2.6.6:

Jag håller på och utvecklar ett program som använder ett annat bilbiotek (no shit). Låt säga att det biblioteket har en metod som kan anropas:

send(port=80) <-- då skickas ett paket på port 80 send() <-- då skickas paket på standardporten angiven i libet

I min kod finns en klass som vi kallar:

class A: def __init__(self, aport): self.aport = aport

Jag anropar sedan koden med:

a = A() send(port=a.aport)

Men nu till frågan: Jag vill ha en condition, så att om aport is None så ska den bara anropa:

a = A() send()

Dvs utan "port=", då libet jag använder själv räknar ut ett lämpligt värde.
Jag har dessutom betydligt fler parametrar jag behöver göra samma sak med så det är inte
direkt möjligt att skriva en miljon if-satser för alla möjliga kombinationer.

Hur kan man lösa detta??

Visa signatur

Citera mig för svar.
Arch Linux

Permalänk
Medlem

Självklart har man suttit i flera timmar och letat efter ett svar och inte hittat, men så fort man har postat och frågat om hjälp så dyker lösningen upp. Jag postar den ifall någon annan har ett liknande problem.

Något i stil med:

if self.aport is None: kwargs = {} else: kwargs = {'port' : self.aport} send(**kwargs)

Visa signatur

Citera mig för svar.
Arch Linux

Permalänk
Medlem

Se till att aport alltid är initierad i A (sätt den till None i konstruktorn) och sen är det väl bara att alltid skicka med den?

Visa signatur

WS: Antec P182B | FSP Aurum 500W | Asus P8Z77-V PRO | i5 3570k | 16GB DDR3 | Intel 320 80GB SSD | HDD 5TB | Asus Xonar DX | Arch Linux (x86_64) | Eizo EV2795
HTPC: Philips 50PUS8804, Kodi samt extern usb-disk
Server: Raspberry Pi 3 model B+ | 1GB RAM | HDD 750GB | Arch Linux (armv7h)

Permalänk
Medlem
Skrivet av '[vEX:

;11142218']Se till att aport alltid är initierad i A (sätt den till None i konstruktorn) och sen är det väl bara att alltid skicka med den?

Problemet är att jag inte alltid vill specificera alla parametrar som är möjliga. Vi pratar mellan 10-20st, utan bara en del av dem.

Sen internt anropar jag en annan funktion med de parametrar som är satta likt:

send(sport=43, dport=80)

Men säg att jag har tre extra parametrar pa, pb, pc, då kommer det ju bli:

send(sport=43, dport=80, pa=None, pb=None, pc=None)

Vilket inte fungerar i mitt fall. send() kommer från ett externt lib som inte accepterar None som input, eller rättare sagt, den använder None istället för att själva räkna ut lämpliga värden på pa, pb, pc. Jag ville alltså filtrera bort pa, pb, pc helt från anropet utan att göra likt:

if pa is None and not pb is None and not pc is None: send(sport=43, dport=80, pb=pb.value, pc=pc.value .... mer if-satser för varje case

Säg till om jag förklarar kasst

Visa signatur

Citera mig för svar.
Arch Linux

Permalänk
Medlem

Ah, då är jag med på vad du gör. Då fungerar inte min lösning alls nej. Jag trodde att send() klarade av att få in en parameter som "None" och göra sin magi.

Visa signatur

WS: Antec P182B | FSP Aurum 500W | Asus P8Z77-V PRO | i5 3570k | 16GB DDR3 | Intel 320 80GB SSD | HDD 5TB | Asus Xonar DX | Arch Linux (x86_64) | Eizo EV2795
HTPC: Philips 50PUS8804, Kodi samt extern usb-disk
Server: Raspberry Pi 3 model B+ | 1GB RAM | HDD 750GB | Arch Linux (armv7h)