1

Bon ben forcément, ça allait arriver cheeky C'est même bon signe grin

Alors, commençons :
>>> objtruc = str('truc')
>>> objtruc
'truc'
>>> objtruc.capitalize()
'Truc'
>>> objtruc
'truc'
>>>
Alors, plusieurs questions avec ces trois lignes pourtant élémentaires (on est pas rendus trioui)
Si j'ai à peu près compris, str est un type natif. J'en crée ici une instance appelée objtruc. C'est ça ?

Alors :
1. Comment "l'appel d'un objet" renvoie-t-il un de ses membres (en l'occurence, la chaine associée à l'objet)
2. On s'attendrait que la méthode capitalize() apppliquée à l'objet modifie le contenu de l'objet, plutôt que de renvoyer une copie modifiée. C'est un comportement courant en Python, ou c'est moi qui ai des intuitions foireuses sur ce que c'est supposé faire ?

Merci d'avance !

2

Il n'y a pas de notion de type natif en Python. Tout est objet, absolument tout (y compris les classes qui est une instance de la classe type, les méthodes, les fonctions, les modules, …).
Par contre, tu as des objets immuables et d'autres non.

1. ce n'est pas la chaîne associée à l'objet : la chaîne EST l'objet
2. la chaîne EST l'objet et une chaîne n'est pas mutable => c'est forcément une nouvelle chaîne qui est renvoyée
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

3

Donc si je fais obj = "truc" ou obj = str("truc"), c'est la même chose ?
On dirait que ça fait automatiquement du boxing et de l'unboxing façon C# en fait.

4

Le deuxième ne fait rien :
In [4]: a = "truc" In [5]: b = str(a) In [6]: id(a) Out[6]: 4506635376 In [7]: id(b) Out[7]: 4506635376
a et b sont bien le même objet.
Après, il n'y a pas vraiment de notion de boxing (vu que tout est objet), mais tu as les objets immutables (grosso-modo les types natifs en Java/C++ mais avec des méthodes) et les autres.
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

5

Quand je dis boxing, c'est parce qu'une simple chaine de caractère (donc un champs de bytes) est un objet auquel on peut appliquer des méthodes. Unboxing parce que la chaine est l'objet comme tu dis. Donc on peut appliquer des méthodes à un champs de bytes.
Mais je réfléchis sûrement à trop bas niveau, c'est pas bien. Faut que je me force à penser comme toi grin

6

str n'est pas un champ de bytes. Tu as le type bytes pour ça (qui a aussi des méthodes, bien sûr).
str est un objet immuable, et on s'en fout de la représentation mémoire. Si tu as besoin de connaître la représentation en mémoire, c'est qu'il faut utiliser le type bytes.

Si tu veux écrire dans un fichier, il faut encoder (mais si tu ouvres un fichier en mode texte, l'encodage est transparent).
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

7

flanker (./2) :
Il n'y a pas de notion de type natif en Python
https://docs.python.org/fr/3.8/library/stdtypes.html

embarrassed

Bon, comme je me doute bien que tu racontes pas de la merde sur le sujet, question : c'est mal traduit, ou alors il est en fait question de types spécifiés par le standard et fournis par stdlib, ou même par le "core" du langage ?

8

Je pensais au sens Java du terme (avec int qui est un type natif et Integer qui en est la version objet). Donc ta dernière hypothèse est la bonne.
La doc que tu montres parle en effet de types natifs au sens « types standards intégrés à l'interpréteur », disponibles sans avoir besoin de charger un module. Mais à part cette différence, il n'y a aucune différence avec les autres classes ou objets.
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

9

c'est marrant, il y aurait marqué js dans le titre tout serait exactement pareil cheeky
et la le mec il le pécho par le bras et il lui dit '

10

Bon, j'avance dans la doc et les petits tests en console (super pratique, la console, ça change des heures de settings pour les compilateurs grin)

Là je viens de lire un truc qui me trouducute quand même un peu :
L'exécution d'une fonction introduit une nouvelle table de symboles utilisée par les variables locales de la fonction. Plus précisément, toutes les affectations de variables effectuées au sein d'une fonction stockent la valeur dans la table de symboles locale ; en revanche, les références de variables sont recherchées dans la table de symboles locale, puis dans la table de symboles locale des fonctions englobantes, puis dans la table de symboles globale et finalement dans la table de noms des primitives
Ca veut dire... qu'une variable X dans une fonction masquera la variable X de la fonction appelante, mais que la variable X de la fonction appelante sera visible si elle n'est pas redéfinie dans la fonction appelée ??
C'est moi ou c'est casse-cou, error-prone, et contre toute notion de privatisation et de protection de données en général (encapsulation par exemple) ?

Sauce : https://docs.python.org/fr/3.8/tutorial/controlflow.html#defining-functions

edit -> ah ben non :
>>> def func1():
...  x = 1
...  func2()
...
>>> def func2() :
...  print(x + 1)
...
>>> func1()
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in func1
  File "<stdin>", line 2, in func2
NameError: name 'x' is not defined
Bon ben je raconte que de la mayrde et j'ai rien compris à leur formulation cry Mais au moins, ça me parait plus naturel grin

11

Bon, on a bien un passage par valeur, et non par référence au sens C++ :
>>> def func1():
...  x = 1
...  func2(x)
...
>>> def func2(truc):
...  print(truc + 1)
...
>>> func1()
2
>>>

Notes :
- ça fait bizarre de ne pas mettre de type aux variables et aux arguments. Peut-être est-ce une très mauvaise pratique, bien que je crois que Python soit bon en inférence de type.
- il me reste à savoir comment faire un véritable passage par référence, équivalent d'un passage par pointeur à la syntaxe près, et permettant de modifier les données dans la fonction appelante smile

12

robinHood (./9) :
c'est marrant, il y aurait marqué js dans le titre tout serait exactement pareil cheeky
Non. Jamais un mec respectable comme Folco ne toucherait au Javascript embarrassed

Folco (./11) :
Bon, on a bien un passage par valeur, et non par référence au sens C++
Tu es sûr que tu ne voulais pas écrire ça plutôt ?
>>> def func1():
...  x = 1
...  func2(x)
...  print(truc)
...
>>> def func2(truc):
...  x = x + 1
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

13

non, mais faut que je teste aussi.
Et à mon avis, ça va être rejeté parce que func2 n’a pas le droit de modifier x (c’est dit explicitement dans la doc).
La, je voulais voir si func2 avait le droit de lire x : même pas. Je comprends donc pas le premier pavé de doc, en gras, posté plus haut...

14

Au pif, je dirais que ça s'applique pour les fonctions anonymes déclarées à l'intérieur d'une autre fonction (les lambdas, si je ne dis pas de bêtise), mais par pour les appels de fonctions classiques ; autrement dit, "englobante" ne veut pas dire "appelante".
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

15

Ah ok, bien vu, c’est probablement ça en effet smile

16

Folco (./11) :
- ça fait bizarre de ne pas mettre de type aux variables et aux arguments. Peut-être est-ce une très mauvaise pratique, bien que je crois que Python soit bon en inférence de type.
Il n'y a pas besoin car Python fait du tapage dynamique… c'est parfois pratique (très), mais 99% du temps c'est casse-gueule. Du coup, j'ai l'habitude d'indiquer les types pour aider PyCharm dans son inférence de type.
Ma règle d'or en programmation est que je ne me prive jamais d'une aide gratuite.

- il me reste à savoir comment faire un véritable passage par référence, équivalent d'un passage par pointeur à la syntaxe près, et permettant de modifier les données dans la fonction appelante smile
Considère que les passages sont toujours par référence (sauf pour les types immutables).
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

17

flanker (./16) :
Ma règle d'or en programmation est que je ne me prive jamais d'une aide gratuite.
Ah c'est donc ça, le stagiaire enchaîné sous ton bureau ?
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

18

shhh (mais c'est pas celui de Pen²)
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

19

(ah mais c'est sûr, sinon tu n'aurais pas appelé ça de l'aide ^^)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

20

0² bah pour le coup tout est pareil cheeky

en js il faudrait englober la variable à modifier dans un objet :P
function inc( obj ){
 obj.value++;
}

function thisinc(){
 this.value++;
}

let o = { value:1, inc:thisinc };

console.log( o.value );
inc( o );
console.log( o.value );
o.inc();
console.log( o.value );
thisinc.call( o );
console.log( o.value );
et la le mec il le pécho par le bras et il lui dit '

21

Sinon, pour la portée des variables… effectivement, c'est pourri en Python et il y a régulièrement des volontés pour changer ça, mais c'est bordélique à changer après coup.
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

22

Donc concrètement, tu peux me résumer les différences par rapport au C/C++ stp ?

Et pour les arguments, on peut donc considérer qu’on passe une copie par valeur pour les types immutables, et un pointeur pour les types mutables, c’est bien ça ?

23

Voilà smile
(par contre, je pense que j'oublierais beaucoup trop de choses comme différence grin)
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

24

(ah mayrde, ça sent pas bon ça grin)

25

Depuis Python 3.5 on peux donner un hint sur le type du paramètre:

def greeting(name: str) -> str: return 'Hello ' + name
https://docs.python.org/3/library/typing.html
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

26

C'est rigolo de voir Python, JS et PHP converger avec exactement les mêmes choix grin (mais quelque part c'est aussi rassurant, pour une fois !)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

27

Il y a une différence majeure entre JavaScript et le reste (enfin surtout python et Lua) le type d’une variable est peut être automatiquement décidé à l’affectation, mais le typage reste fort, ça que le JavaScript ne fait pas.

Pas sur pour PHP mais il me semble que le typage est faible aussi.

Et ça change pas mal de choses, pas mal de truc degeux du JS viennent du typage faible...
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

28

> pas mal de truc degeux du JS viennent du typage faible...

ça vient plutôt surtout du dev !
et la le mec il le pécho par le bras et il lui dit '

29

Du dev faible, oué trioui

30

robinHood (./28) :
> pas mal de truc degeux du JS viennent du typage faible...

ça vient plutôt surtout du dev !
Le fameux adage « il n'y a pas de mauvais langage, que des mauvais dev… ». Un adage que je trouve bien étrange
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant