Új hozzászólás Aktív témák
-
-
-
kovisoft
őstag
Két datetime különbsége timedelta típusú. Ezt nem tudod szimplán összehasonlítani egy int-tel. Helyette a timedelta-ból kell egy int-et csinálnod. Pl. ha az adott maximum másodpercet jelent, akkor a timedelta seconds attribútumával kell összehasonlítani. Ha a maximum stringben van, akkor először azt is konvertáld int típusra, valahogy így:
diftime = most - ido()
maximum = "10"
print int(maximum) - diftime.seconds
-
kovisoft
őstag
válasz pigster #1803 üzenetére
Ha a kartyak tömb 0. elemére akarsz hivatkozni, akkor így hivatkozz rá: kartyak[0], mert ha kartyak[0:1] -et írsz, akkor ez nem egy elem, hanem egy rész-tömb lesz, ami csak a 0. elemet tartalmazza. Ez látszik is abból, hogy ha kiíratod, akkor szögletes zárójelek közé teszi.
-
kovisoft
őstag
válasz pigster #1819 üzenetére
Igen, az x objektum stringgé konvertálásakor (pl. str(x), print("%s" % x), stb) az __str__ metódus hívódik meg, ezt kell felülírnod, ha saját olvasható formázást akarsz. Ha az __str__ nincs definiálva, akkor a __repr__ hívódik meg. Ha ez sincs definiálva, akkor is van egy alapértelmezett reprezentáció, amit már te is láttál ebben a példádban:
<kartya.Kartya object at 0x000002AE6652D860>
-
kovisoft
őstag
válasz McSzaby #1836 üzenetére
Nem biztos, hogy értem a problémát. Mi a gond azzal, hogy szimplán átadod paraméterként? Példa:
def myfunc1(d):
print(repr(d))
def myfunc2(d):
myfunc1(d)
d['a']=3
myfunc1(d)
mydict={}
mydict['a']=1
mydict['b']=2
myfunc2(mydict)output:
{'a': 1, 'b': 2}
{'a': 3, 'b': 2}[ Szerkesztve ]
-
-
kovisoft
őstag
válasz s1999xx #1869 üzenetére
Nem azt mondom, hogy eval-t kell használni unit teszthez, csak annyit, hogy láttam már olyat, ahol használják. Pl. ha nem elég az, amit a standard assert biztosít, ezért egy saját assert változatot akar csinálni az ember, akkor annak a belsejében a saját assertnek átadott kifejezések kiértékeléséhez kellhet az eval. Ami hirtelen eszembe jut: ha olyan függvényeket tesztelek, amik maguk is AssertionError-t dobnak, és meg akarom különböztetni ezt a unit teszt AssertionError-jától.
-
kovisoft
őstag
válasz Siriusb #1871 üzenetére
Egy lehetőség, talán működik: A renderer.connect() híváshoz plusz paraméterként tudsz user_param-okat hozzárendelni. Ezt használhatod pl. az oszlop sorszámának megadására, és ezt meg fogja kapni a text_edited() egy plusz user_param paraméterben. A path megmondja, hogy melyik sorban van a módosított cella, a user_param pedig megadja az oszlop számát.
Valami ilyesmire gondolok (tegyük fel, hogy a liststore el van tárolva egy memberváltozóban, de akár ezt is át lehet adni user_param-ként):
def edit_selected(self, widget):
...
column = ...
renderer.connect("edited", self.text_edited, column)
def text_edited(self, widget, path, new_text, user_param):
self.liststore[path][user_param] = new_text -
-
kovisoft
őstag
válasz Wmwinters01 #1885 üzenetére
A python nagyon jó első nyelvnek, mert könnyen tanulható. És nem minden nyelven ugyanakkora erőfeszítés programozni tanulni.
-
kovisoft
őstag
Engem régebben a range() készített ki Python 3-ban, ugyanis itt már lazy módon értékelődik ki (csak akkor, amikor ténylegesen felhasználjuk az elemeit). Próbálgattam command promptban mindenféle range-eket, és csak ennyit írt ki:
>>> range(10)
range(0, 10)Ugyanez Python 2-ben:
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]Python 3-ban pl. a list-tel lehet kikényszeríteni a kiértékelést::
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9][ Szerkesztve ]
-
kovisoft
őstag
válasz s1999xx #1911 üzenetére
Mármint mire nem jó példa? Aki a python 2-es range()-hez van szokva, vagy most ismerkedik a nyelvvel egy python 2-es könyv alapján, annak egy python 3 REPL-ben nem minden fog úgy működni, ahogy gondolná. Pont úgy, mint mondjuk ha python 2-es osztást vagy printelést akar csinálni python 3-ban.
-
kovisoft
őstag
válasz s1999xx #1913 üzenetére
Ennyi erővel a print sem jó példa, mert python 3-ban a python 2-es print sem létezik. Arról volt eredetileg szó, hogy adva van egy python 2-es tankönyv, és milyen különbségek lehetnek a python 3-ra átállásnál. Aki tudja, hogy milyen különbségek vannak, annak nem okoz problémát, hogy megtalálja a 3-as megfelelőjét egy 2-es funkciónak. Aki nem nem tudja, az belefuthat majd a print, /, range, execfile, stb különbségekbe.
-
kovisoft
őstag
válasz AeSDé Team #1915 üzenetére
Az nem működik, hogy az App importját áthelyezed későbbre, csak amikor már ténylegesen szükség van rá? Erre gondolok:
class Controller:
def __init__(self):
from app import App
self.app = App(self) -
kovisoft
őstag
válasz Siriusb #1919 üzenetére
Használhatsz regex-et is (mondjuk szebb nem lesz tőle):
import re
if re.search(r"\babc\b", "bla bbla ba ABC bla", re.IGNORECASE):A \b akkor kell, ha teljes szóra akarsz keresni ("word boundaries"), ha pedig kihagyod az utolsó IGNORECASE paramétert, akkor számítani fog a kis-nagybetű.
-
kovisoft
őstag
válasz Siriusb #1962 üzenetére
Hiányzik az 'l' a linked végéről, helyesen: https://www.jetbrains.com/help/pycharm/quick-start-guide.html
-
kovisoft
őstag
Kár ezen a kígyós témán ennyit pörögni, a hivatalos python logó is két kígyót ábrázol ("two snakes" logo).
-
kovisoft
őstag
Nekem a thread kezelés nem teljesen kerek. Ha jól látom, minden egyes kliens csatlakozásánál létrejön egy szerver thread, ami végtelen ciklusban fut, és akkor sem lép ki, amikor a kliens lezárta a kapcsolatot (minden exception le van nyelve a ciklusban). Tehát ha sokszor csatlakoznak a kliensek, akkor ezek a thread-ek mind megmaradnak. Vagy rosszul látom?
-
kovisoft
őstag
Másik megjegyzésem a kliensre vonatkozik: a kliens egy cikluson belül olvassa a szervertől jövő választ, ill. küldi az új üzenetet. Viszont ha a szerver valamiért sokáig nem válaszol, akkor a recv blokkol, és ezért addig új üzenetet sem fog tudni küldeni. Ez nem feltétlen baj, hogy nincsenek egymásra eresztve az üzenetek, de innen hiányzik nekem minimum valami hibakezelés. Pl. mi történjen socket.error esetén? Lépjen ki a kliens? Vagy próbáljon nyitni egy új kapcsolatot a szerver felé? Ki kell-e timeout-olni, ha valamiért nem érkezik meg a válasz egy üzenetre? Heartbeat küldést most nem látok, de ha lenne, akkor gondolom fontos lenne, hogy egy beragadt üzenet ne blokkolja a heartbeat-et.
-
kovisoft
őstag
EQMontoya megoldása talán a legegyszerűbb, legelegánsabb és leggyorsabb, viszont nem tartja meg az eredeti elemek sorrendjét. Nem tudom, hogy ez szempont volt-e, mindenesetre ha igen, és list comprehensiont akarsz használni, akkor itt egy olyan verzió, ami megtartja az elemek sorrendjét:
newArr = []
[newArr.append(i) for i in arr if i not in newArr]
print(newArr) -
kovisoft
őstag
válasz EQMontoya #2042 üzenetére
De hát ugye ez is egy ciklus, hiszen végigmegy a filter a kulcsokon.
Ha nagyon fontos, hogy O(1) lépésben meglegyen, akkor típus szerint külön dict-ben célszerű tárolni az elemeket. Ekkor viszont az összes dict-ben egyszerre történő keresés lesz macerásabb, amire lehet írni egy függvényt, ami típus szerint a megfelelő dict-ből olvas. Vagy lehet használni az unpacking operatort (**) a dict-ek összefűzésére, pl:
> dtuple={(1,2,3):1, (4,5,6):2}
> dint={7:3, 8:4}
> {**dtuple, **dint}
{(1, 2, 3): 1, (4, 5, 6): 2, 7: 3, 8: 4} -
kovisoft
őstag
Egyrészt nem hívhatod meg argumentum nélkül, mert a definícióban fixen ott van az op argumentum. Másrészt az argumentum nélküli meghívásnál is kellenének a zárójelek, de az is hiányzik, ezért ez így nem függvényhívás, hanem a függvény objektum lekérése:
> five('')
'5'
> five
<function five at 0x7f3901b8ae18>
> five()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: five() missing 1 required positional argument: 'op' -
kovisoft
őstag
Igen, tökéletesen igazad van, lehet számlálni is, de nem egyetlen számlálót kell akkor sem nyilvántartani, hanem típusonként egyet, mivel az eredeti feladat szerint azt akarta tudni, hogy van-e adott típusú elem a dict-ben (a tuple csak egy példa volt). Tehát a módszereddel kell egy dict a típusokra, és abban nyilvántartani minden típusra az elemek számát. Amúgy Én is EQMontoya elegáns megoldását választanám, hacsak nem kell mindenáron ügyelni a performanciára.
-
kovisoft
őstag
válasz Janos46 #2080 üzenetére
Az zavarhatott meg, hogy a print-nek lehet adni több paramétert, ezeket mind ki fogja írni egymástól elválasztva. A write-nak viszont ennél kötöttebb a formátuma, csak egy stringet tud kiírni, tehát amit a print-nél vesszőkkel elválasztva írattál ki, azokból (ahogy a többiek előttem már javasolták) össze kell állítani egy db stringet, és azt átadni a write-nak.
-
kovisoft
őstag
válasz McSzaby #2098 üzenetére
Az nem jó, hogy valószínűségi alapon számolod ki, hogy csináljon-e valamit vagy sem? Pl. ha az esetek 70%-ában kell, akkor csak akkor csináljon valamit, ha egy 0-1 közötti random szám kisebb, mint 0.7.
Ha ez nem elég pontos, akkor azt is nyilván kellene tartani, hogy hányszor futott, ebből hányszor csinált valamit, és a randomban vizsgált százalékot módosítani ezzel az aránnyal (pl. ha 70%-ban kellene valamit csináljon, és eddig 50-ből 35 helyett csak 30-szor csinálta, akkor növelni a százalékot).