PEP 536: Típus-annotációk késleltetett kiértékelése
A típus-annotációkban korábban csak olyan elemeket lehetett használni, amelyek már elérhetőek voltak az adott névtérben. Az új eljárást használva a fordító sztringként tárolja el az annotációkat.
from __future__ import annotations
class C:
@classmethod
def from_string(cls, source: str) -> C:
...
def validate_b(self, obj: B) -> bool:
...
class B:
...
PEP 557: Adat-osztályok
A népszerű attrs modul mintájára és alkotójának közreműködésével létrejött a dataclasses
modul, amivel kényelmesebben hozhatók létre osztályok:
from dataclasses import dataclass
@dataclass
class Position:
name: str
lon: float = 0.0
lat: float = 0.0
>>> Position('Null Island')
Position(name='Null Island', lon=0.0, lat=0.0)
>>> Position('Greenwich', lat=51.8)
Position(name='Greenwich', lon=0.0, lat=51.8)
A speciális metódusok (__init__()
, __repr__()
, __eq__()
) ezután automatikusan létrejönnek, és az adat-osztály egy normál osztályként használható. A field()
metódussal további tulajdonságok állíthatóak be az attribútumokhoz, mint például meta-adatok, default_factory
függvény, bekerüljön-e az objektum hash értékébe, stb.
PEP 553: Beépített breakpoint()
függvény
A debuggolást segíti az új
breakpoint()
beépített függvény, ami lényegében az
import pdb; pdb.set_trace()
sornak felel meg, azaz olyan pontokat definiál a forráskódban, ahol átléphetünk egy debuggerbe. Továbbá a PYTHONBREAKPOINT
környezeti változóban megadható, hogy milyen debugger induljon el ezeknél a pontoknál, illetve 0-t beállítva ki is kapcsolhatóak a breakpoint()
-ok.
-X importtime
opció: Importálási idők mérése
Néhány új, fejlesztést segítő opcióval is bővült a CLI, mint például
-X importtime
, amivel a szkriptben fellelhető importálási időkről kapható egy összesített táblázat:
$ python3.7 -X importtime my_script.py
import time: self [us] | cumulative | imported package
import time: 2607 | 2607 | _frozen_importlib_external
...
import time: 844 | 28866 | importlib.resources
import time: 404 | 30434 | plugins
- A hozzászóláshoz be kell jelentkezni
- 4974 megtekintés
Hozzászólások
Ez egy jó összefoglaló volt, köszi! :)
-----
„Egy jó kapcsolatban a társunkat az ő dolgában kell támogatni, nem a miénkben.”
rand() a lelke mindennek! :)
Szerinted…
- A hozzászóláshoz be kell jelentkezni
Fullos összefoglaló, köszi!
"illetve a dict objektum immáron megőrzi az elemek sorrendjét."
Deja Vu. Meg mernék eskudni, hogy ez van a 3.6-ban is, de talán már a 3.5ben is volt. Változott valami ekorul vagy az emlékeim rosszak?
-------------------------
Roses are red
Violets are blue
Unexpected '}' on line 32
- A hozzászóláshoz be kell jelentkezni
Mármint OrderedDict nélkül?
- A hozzászóláshoz be kell jelentkezni
3.6 óta egy optimalizáció mellékhatásaként megtartják a sorrendet a dict-ek. Ami most változott, hogy hivatalosan is ordered lett a dict, tehát lehet rá számítani, hogy a jövőben se fog megváltozni.
- A hozzászóláshoz be kell jelentkezni
És ez hogy működik? A `dict[key1]` mellett már a `dict[0]` is használható lesz?
- - -
TransferWise
- A hozzászóláshoz be kell jelentkezni
Python <=3.5
>>> a = {"one": 1, "two": 2, "three": 3}
>>> a
{'two': 2, 'one': 1, 'three': 3}
>>> list(a)[0]
'two'
Python >=3.6
>>> a = {"one": 1, "two": 2, "three": 3}
>>> a
{'one': 1, 'two': 2, 'three': 3}
>>> list(a)[0]
'one'
- A hozzászóláshoz be kell jelentkezni
Köszönöm.
- - -
TransferWise
- A hozzászóláshoz be kell jelentkezni
PHPython ?!?
kiváncsi lennék ez mekkora performaciavesztéssel járt
~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack
- A hozzászóláshoz be kell jelentkezni
Méretügyileg:
$ python3.5 -c 'import sys; print(sys.getsizeof({str(i):i for i in range(10000)}))'
393312
$ python3.6 -c 'import sys; print(sys.getsizeof({str(i):i for i in range(10000)}))'
295008
Sebességügyileg:
$ python3.5 -m timeit -s 'd={str(i):i for i in range(100)}' 'd["10"]; d["30"]; d["50"]; d["70"]; d["90"]'
10000000 loops, best of 3: 0.0991 usec per loop
$ python3.6 -m timeit -s 'd={str(i):i for i in range(100)}' 'd["10"]; d["30"]; d["50"]; d["70"]; d["90"]'
10000000 loops, best of 3: 0.0964 usec per loop
Szóval kb ugyanolyan gyors, de jelentősen kevesebb helyet használ a memóriában.
- A hozzászóláshoz be kell jelentkezni
Pythonnal mennyire gyors a verziovaltas? Ha C++-nal van uj nyelvi feature, upgrade-elem a forditot, leforditom az ujjal, es mar hasznalhatom is. Javanal/PHP-nel meg az osszes tobbi futtatokornyezetes nyelvnel meg kell varnom mig az n+1. verzio elterjed, elotte hiaba hasznalnam, nem fog menni a celgepen. Pythonnal mennyire gyors ez a valtozas? (Linux disztrokban pl. szokott lenni kigyo alapbol)
--
If you get a good wife, you'll become happy; if you get a bad one, you'll become a philosopher. -Socrates
- A hozzászóláshoz be kell jelentkezni
Lassú.
Viszont normális alkalmazáshoz az ember csomagolja a hozzá való futtatókörnyezetet (pl. JVM). És itt jön a képbe a konténerizáció.
- A hozzászóláshoz be kell jelentkezni
Ez igazából nem a "verzióváltás sebességétől" függ, hanem attól, hogy byte kódot generál-e az a nyelv fordítója vagy a kód feldolgozását és értelmezését a futtatás pillanatában teszi-e.
- A hozzászóláshoz be kell jelentkezni
Bontsuk ketté a dolgot 2.x->3.x és 3-as ágon történő frissítésre. 2-es ágon sokan az utolsó 2.7-nél ragadtak le, mert nincs pénz/erőforrás/munkaerő, hogy egy régi, jól működő, nagyobb kódot átírjanak 3.x alá, sőt még 2.6-os kódok is előfordulnak a CentOS/RHEL 6-nak köszönhetően. Ez egy valódi, gyakran vitatott probléma a Python közösségen belül. Népszerű csomagok tekintetében már úgy 2-3 éve jól áll a dolog, minden jelentős csomag működik 3.x alatt vagy van ekvivalens alternatívája.
A 3-as ágon már szerintem gördülékenyebb a dolog. Windows-on aki akar, az frissít, Linuxon meg kb. ahogy a nagy LTS disztribúciókban megjelenik az új változat, úgy terjed lényegében, azaz 1-2 éves lemaradásban a legfrissebb kiadástól (nagyjából másfél évente jön egy újabb kiadás a 3.x ágban).
Általában az a mondás, hogy ha saját célra készítesz kódot, akkor használd nyugodtan a legújabb kiadást. Ha publikus csomagot készítesz, akkor meg nem árt, ha megy a legrégebbi támogatott 3.x változattal, de sok helyen láttam 3.6+-ot megkövetelő csomagokat (a 3.6-tal érkező f-sztring formázás sokak kedvenc új ficsőre lett).
- A hozzászóláshoz be kell jelentkezni
Végre lett datetime.fromisoformat().
--
$ grep -c egy\$ word.list
100
- A hozzászóláshoz be kell jelentkezni
1 szó százat csinál? :) (sub)
- A hozzászóláshoz be kell jelentkezni
hideg :)
más ötlet?
--
$ grep -c egy\$ word.list
100
- A hozzászóláshoz be kell jelentkezni
Egy magyar kozmondas, vege a vege. (nem akarom elspoilerezni)
--
If you get a good wife, you'll become happy; if you get a bad one, you'll become a philosopher. -Socrates
- A hozzászóláshoz be kell jelentkezni
OK, megvan :)
- A hozzászóláshoz be kell jelentkezni
forró :)
--
$ grep -c egy\$ word.list
100
- A hozzászóláshoz be kell jelentkezni
Ha már amúgy is offtopic szál, jelzem fölösleges a \ a .sig -ben.
A szöveg - látszólag - egy Jujniksz rendszert futtató gépen kiadott parancs és eredménye, de a Jujniksz rendszerek parancsértelmezői az önmagukban álló $-jelet nem kezdik el speciális karakternek értelmezni, és emiatt nem kell eltakarni a jelentésüket.
Az, hogy "nem kell", az persze nem azt jelenti, hogy hiba, talán inkább felesleges túlbiztosításnak lehetne mondani.
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
Nem is tudtam, köszi! A fejemben az volt, hogy van pár karakter, amit gondolkodás nélkül védünk a shelltől, hogy eljusson a parancshoz. Az, hogy már nem ilyesmiket írok, néha abban a hitben ringat, hogy én vagyok a helikopter:
$ cat word.list | grep 'egy$' | wc -l
Eddig is sokat tanultam tőled és ez így is marad még egy jó ideig :)
--
$ grep -c egy$ word.list
100
- A hozzászóláshoz be kell jelentkezni
„a Jujniksz rendszerek parancsértelmezői az önmagukban álló $-jelet nem kezdik el speciális karakternek értelmezni”
Túl sok parancsértelmezőt ugyan nem ismerek közelebbről, bash esetében így igaz, de például az általam alapértelmezettként használt fish esetében bizony el kell takarni, hiszen ott a $ változót vezet föl.
fish: Expected a variable name after this $.
grep -c egy$ word.list
^
Tény persze, hogy nem olyan ismert és elterjedt, bár BSD-n is elvan. Szóval az escape-elt verzió biztosabb. :)
______________
"If you immediately know the candlelight is fire, the meal was cooked a long time ago."
- A hozzászóláshoz be kell jelentkezni
A fish nem POSIX shell, így a vele való kompatibilitással felesleges foglalkozni.
- A hozzászóláshoz be kell jelentkezni
Vajon melyik verziótól kezdve fogják az indentation kötelezőségét kiküszöbölni így a 21. század tájékán és vajh mikortól kezdenek el gondolni a visszafelé kompatibilitásra? Amúgy szuper nyelv amikor erre van szükség és persze, nem elégedetlenkedés :)
- A hozzászóláshoz be kell jelentkezni
> Vajon melyik verziótól kezdve fogják az indentation kötelezőségét kiküszöbölni
Szerintem soha. Ez ilyen opinionated dolog, lehet nem szeretni, ez ilyen
> mikortól kezdenek el gondolni a visszafelé kompatibilitásra?
Itt mire gondolsz? A kettes ág erősen kompatibilis visszafele. Szerintem a hármason sincs olyan, ami 3.1ben még ment, most a 3.7ben meg ne menne. Az, hogy volt egy direkt deklaráltan breaking change, az egy dolog.
- A hozzászóláshoz be kell jelentkezni
Az indentation alapvető nyelvi elem, ezen sosem fognak változtatni, ahogy a klasszikus Python2 vicc is mutatja:
$ python2
Python 2.7.15 (default, May 1 2018, 20:16:04)
>>> from __future__ import braces
File "<stdin>", line 1
SyntaxError: not a chance
Visszafelé kompatibilitást nem tudom hogy lehetne megvalósítani úgy, hogy közben fejlődjön is a nyelv. Olyan értelemben amúgy létezik, hogy egy <3.7-es kód nagyon jó eséllyel változtatás nélkül (vagy triviális módosításokkal) megy 3.7-tel is.
- A hozzászóláshoz be kell jelentkezni
> Visszafelé kompatibilitást nem tudom hogy lehetne megvalósítani úgy, hogy közben fejlődjön is a nyelv.
Javascript esetében vannak fordítók, amik lehetővé teszik, hogy régebbi parancsértelmezőn is fusson a kód, pl.:
var list = [ 1, 2, 3 ]
list.map(n => n ** 2)
var [ a, b, c ] = list
kódot átalakítja
var list = [1, 2, 3];
list.map(function (n) {
return Math.pow(n, 2);
});
var a = list[0],
b = list[1],
c = list[2];
formára. Ilyen módon elég bonyolult új feature-öket is meg tudtak valósítani, pl async/await vagy generátorok.
- A hozzászóláshoz be kell jelentkezni
Igen, a JavaScript esetében nagy hagyománya van az ilyen fordítóknak/transpilereknek az ezerféle környezet miatt. Pythonhoz eddig nem tudtam ilyesmiről, de most rákerestem és tényleg létezik egy projekt: https://github.com/nvbn/py-backwards Azonban a Python nincs nagyon efféle működésre felkészítve, lehetnek nem várt mellékhatások és kellemetlenségek.
- A hozzászóláshoz be kell jelentkezni
Nem baj, megirod Trumpscriptben, aztan azt konvertalod pythonra.
--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin
- A hozzászóláshoz be kell jelentkezni
Miért kellene az indentation kötelezőségét kitiltani? Szerintem remek dolog és rávezet a szép/szebb programozásra.
-----
„Egy jó kapcsolatban a társunkat az ő dolgában kell támogatni, nem a miénkben.”
rand() a lelke mindennek! :)
Szerinted…
- A hozzászóláshoz be kell jelentkezni
Nagyon remélem, hogy soha nem engedik el az indentation függőséget. Egyszerűen felbecsülhetetlen sokat dob az olvashatosagon az hogy ránézésre meg tudsz mondani egy rakat dolgot egy kodról és nem kell túrni, hogy mi hol mibe van beleagyazva (nested) mert vizuálisan minden meg van kulonboztetve.
Ha betartod a PEP szabályokat (ebben egy ide nagy segítség), akkor nagyon frankó, olvasható kódot tudsz írni erőlködés nélkül.
-------------------------
Roses are red
Violets are blue
Unexpected '}' on line 32
- A hozzászóláshoz be kell jelentkezni
Guido van Rossum 28 év után lemondott a vezetői pozícióról a PEP 572-t övező kritikák után. (ami egyébként számomra se szimpatikus első ránézésre)
- A hozzászóláshoz be kell jelentkezni
C-ben mindig is mukodott. A baj talan a := miatt van, jobb lett volna, ha anno a = az ertekadas marad, es == a vizsgalat, mint a c-like nyelveknel. Es akkor nem lenne most problema. Raadasul egy csomo programozo amugy is ezt szokta meg (es szerintem tobben hasznalnak c-like nyelveket, jobb lett volna ehhez igazodni egyebkent is).
--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin
- A hozzászóláshoz be kell jelentkezni
> jobb lett volna, ha anno a = az ertekadas marad, es == a vizsgalat
Tudomásom szerint ez így van python-ban. Az új operatorra azért volt szükség, mert egyszerre végzi a kettőt.
PEP 572 nélkül
first_num_match = re.search("[0-9]", text)
if first_num_match:
print("First number in text: %s" % first_num_match.group(0))
PEP 572-vel
if first_num_match := re.search("[0-9]", text):
print("First number in text: %s" % first_num_match.group(0))
Tehát vizsgálja, hogy a search eredményt ad vissza és ebben az esetben a visszatérési értéket el is tárolja.
Tudtommal C-ben nincs ilyen
- A hozzászóláshoz be kell jelentkezni
Szerintem az utóbbi tömörebb, de nehezebben érthető.
-----
„Egy jó kapcsolatban a társunkat az ő dolgában kell támogatni, nem a miénkben.”
rand() a lelke mindennek! :)
Szerinted…
- A hozzászóláshoz be kell jelentkezni
Tudtommal C-ben nincs ilyen
Hogy a fenébe ne lenne?!? Az értékadó operátorok (=, += és társaik) mind egyúttal kifejezésként is használhatóak, és az értékadás eredménye lesz a kifejezés értéke.
#include <stdio.h>
int main(int argc, char **argv)
{
int a;
int s = 3;
printf("%d\n", a = 2+3);
printf("%d\n", s += 4);
return 0;
}
Ez pl. azt fogja mondani, hogy 5 és 7.
- A hozzászóláshoz be kell jelentkezni
jogos, még a pep 572 doksija is megemlíti:
> Why not just turn existing assignment into an expression?
> C and its derivatives define the = operator as an expression, rather than a statement as is Python's way. This allows assignments in more contexts, including contexts where comparisons are more common. The syntactic similarity between if (x == y) and if (x = y) belies their drastically different semantics. Thus this proposal uses := to clarify the distinction.
- A hozzászóláshoz be kell jelentkezni
Akkor viszont jogos a kritika, es a lemondas. Legyen az = siman kifejezes is, es kesz!
--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin
- A hozzászóláshoz be kell jelentkezni
Az egy fasság. A C-ben is az. A legjobb megoldást választotta az emberünk, btw.
- A hozzászóláshoz be kell jelentkezni
A sima = szerintem is rosszabb lett volna. (így legalább a linter tud szólni, ha elírás van)
Én egyszerűen kihagytam volna a nyelvből, mert egyelőre úgy látom, hogy nem jár annyi előnnyel, hogy megérje a plusz operátor bevezetése. (bár a
white True:
kódok lecserélése elég jól hangzik)
Azt azért érdemes megjegyezni, hogy GvR nem egyedül döntött a feature bevezetéséről, hanem egy fél éves vita előzte azt meg.
- A hozzászóláshoz be kell jelentkezni