🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.programming
4 messages
4 total messages Started by Roman Tyczka Wed, 17 Feb 2021 14:13
Lambda w Pythonie
#217407
Author: Roman Tyczka
Date: Wed, 17 Feb 2021 14:13
39 lines
2269 bytes
Być może źle do tego podchodzę... ale potrzebuję funkcji X(), która 
zwraca jakieś dane, tę funkcję muszę przekazać dalej i gdzieś tam w 
trzewiach biblioteki zostanie wywołana i pobrana z niej wartość.
Problem polega na tym, że funkcja ma zwracać różne dane w zależności od 
pewnego parametru, ale samego parametru jej przekazać nie mam jak, więc 
pomyślałem, że zrobię sztuczkę z lambdą/anonymousem, czyli utworzę 
funkcję, która dostanie ten istotny parametr i zwróci lambdę już 
"spreparowaną" pod wymagania wynikające z tego parametru.
No ale nie umiem :-(

Zrobiłem tak:

#funkcja generująca tablicę bajtów o określonej długości
def getCTR(bits: int):
     k = bits // 8
     b = bytes([6])
     return b * k

#typ lambdy, który korzysta z powyższej funkcji
getCTRn = lambda x : getCTR(x)

#funkcja główna, mająca zwrócić lambdę
#spreparowaną na zwrócenie określonej wartości
def getCTRx(bites):
     g: getCTRn = getCTRn(8 * bites)
     return g

i kod właściwy, który tego wszystkiego powyżej używa:

   ctr = getCTRx(algModule.key_size)
   ciph = algModule.new(key, algMode, IV=iv, counter=ctr)

Niestety, zmienna ctr zamiast lambdy otrzymuje od razu tablicę bajtów 
:-( Co robię źle?

-- 
pzdr
Roman
Re: Lambda w Pythonie
#217408
Author: Piotr Chamera
Date: Wed, 17 Feb 2021 15:06
58 lines
2839 bytes
W dniu 2021-02-17 o 15:13, Roman Tyczka pisze:
> 
> Być może źle do tego podchodzę... ale potrzebuję funkcji X(), która 
> zwraca jakieś dane, tę funkcję muszę przekazać dalej i gdzieś tam w 
> trzewiach biblioteki zostanie wywołana i pobrana z niej wartość.
> Problem polega na tym, że funkcja ma zwracać różne dane w zależności od 
> pewnego parametru, ale samego parametru jej przekazać nie mam jak, więc 
> pomyślałem, że zrobię sztuczkę z lambdą/anonymousem, czyli utworzę 
> funkcję, która dostanie ten istotny parametr i zwróci lambdę już 
> "spreparowaną" pod wymagania wynikające z tego parametru.
> No ale nie umiem :-(
> 
> Zrobiłem tak:
> 
> #funkcja generująca tablicę bajtów o określonej długości
> def getCTR(bits: int):
>      k = bits // 8
>      b = bytes([6])
>      return b * k

Może chodziło Ci o coś takiego:

def getCTR(bits: int):
     k = bits // 8
     b = bytes([6])
     return lambda : b * k


 >>> getCTR(8)
<function getCTR.<locals>.<lambda> at 0x02C68660>
 >>> f = getCTR(8)
 >>> f()
b'\x06'
 >>> f = getCTR(32)
 >>> f()
b'\x06\x06\x06\x06'


getCTRn i getCTRx są niepotrzebne

> #typ lambdy, który korzysta z powyższej funkcji
> getCTRn = lambda x : getCTR(x)
> 
> #funkcja główna, mająca zwrócić lambdę
> #spreparowaną na zwrócenie określonej wartości
> def getCTRx(bites):
>      g: getCTRn = getCTRn(8 * bites)
>      return g
> 
> i kod właściwy, który tego wszystkiego powyżej używa:
> 
>    ctr = getCTRx(algModule.key_size)
>    ciph = algModule.new(key, algMode, IV=iv, counter=ctr)

a wywołanie wyglądałoby tak:

ctr = getCTR(algModule.key_size)
ciph = algModule.new(key, algMode, IV=iv, counter=ctr)
Re: Lambda w Pythonie
#217409
Author: Piotr Chamera
Date: Wed, 17 Feb 2021 15:44
68 lines
3316 bytes
W dniu 2021-02-17 o 16:06, Piotr Chamera pisze:
> W dniu 2021-02-17 o 15:13, Roman Tyczka pisze:
>>
>> Być może źle do tego podchodzę... ale potrzebuję funkcji X(), która 
>> zwraca jakieś dane, tę funkcję muszę przekazać dalej i gdzieś tam w 
>> trzewiach biblioteki zostanie wywołana i pobrana z niej wartość.
>> Problem polega na tym, że funkcja ma zwracać różne dane w zależności 
>> od pewnego parametru, ale samego parametru jej przekazać nie mam jak, 
>> więc pomyślałem, że zrobię sztuczkę z lambdą/anonymousem, czyli 
>> utworzę funkcję, która dostanie ten istotny parametr i zwróci lambdę 
>> już "spreparowaną" pod wymagania wynikające z tego parametru.
>> No ale nie umiem :-(
>>
>> Zrobiłem tak:
>>
>> #funkcja generująca tablicę bajtów o określonej długości
>> def getCTR(bits: int):
>>      k = bits // 8
>>      b = bytes([6])
>>      return b * k
> 
> Może chodziło Ci o coś takiego:
> 
> def getCTR(bits: int):
>      k = bits // 8
>      b = bytes([6])
>      return lambda : b * k
> 
> 
>  >>> getCTR(8)
> <function getCTR.<locals>.<lambda> at 0x02C68660>
>  >>> f = getCTR(8)
>  >>> f()
> b'\x06'
>  >>> f = getCTR(32)
>  >>> f()
> b'\x06\x06\x06\x06'
> 
> 
> getCTRn i getCTRx są niepotrzebne
> 
>> #typ lambdy, który korzysta z powyższej funkcji
>> getCTRn = lambda x : getCTR(x)
>>
>> #funkcja główna, mająca zwrócić lambdę
>> #spreparowaną na zwrócenie określonej wartości
>> def getCTRx(bites):
>>      g: getCTRn = getCTRn(8 * bites)
>>      return g
>>
>> i kod właściwy, który tego wszystkiego powyżej używa:
>>
>>    ctr = getCTRx(algModule.key_size)
>>    ciph = algModule.new(key, algMode, IV=iv, counter=ctr)
> 
> a wywołanie wyglądałoby tak:
> 
> ctr = getCTR(algModule.key_size)
> ciph = algModule.new(key, algMode, IV=iv, counter=ctr)

A może getCTRx powinno zwrócić lambdę

def getCTRx(bites):
     g: getCTRn = getCTRn(8 * bites)
     return lambda : g

wtedy cały Twój przykład działa tak jak poprzednio, tzn zwraca taką samą 
tablicę, tylko przez funkcję a nie bezpośrednio...
Re: Lambda w Pythonie
#217410
Author: Roman Tyczka
Date: Wed, 17 Feb 2021 19:12
28 lines
2045 bytes
W dniu 17.02.2021 o 16:44, Piotr Chamera pisze:
>> Może chodziło Ci o coś takiego:
>>
>> def getCTR(bits: int):
>>      k = bits // 8
>>      b = bytes([6])
>>      return lambda : b * k
[...]
>>
> A może getCTRx powinno zwrócić lambdę
> 
> def getCTRx(bites):
>      g: getCTRn = getCTRn(8 * bites)
>      return lambda : g
> 
> wtedy cały Twój przykład działa tak jak poprzednio, tzn zwraca taką samą 
> tablicę, tylko przez funkcję a nie bezpośrednio...

Dzięki, już pierwsza odpowiedź rozwiązała mój problem. Trochę to 
zakręcone, ale się przyzwyczajam.... i ciągle coś odkrywam ;-)

W przykładach jakie trafiałem nie było lambdy bezparametrowej, a ta 
Twoja taka jest. Człowiek całe życie nabiera pokory, by spokojnie umrzeć 
w głupocie ;-)

-- 
pzdr
Roman
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads