[Python-ideas] Python reviewed
Simon Lovell
simon58500 at bigpond.com
Mon Jan 9 08:50:12 EST 2017
More information about the Python-ideas mailing list
Mon Jan 9 08:50:12 EST 2017
- Previous message (by thread): [Python-ideas] Python Reviewed
- Next message (by thread): [Python-ideas] Python reviewed
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Hmm, Thanks Chris. I thought I was posting this to the correct place. I've never seen that "for line in open ..." after googling it many times! Why is this question so often asked then? Re:Indentation making end block markers not needed; well yes they aren't /needed/. However, they are useful for readability purposes. Perhaps if I use it some more I'll see that they aren't but I doubt it. Re:PEP249 & SQL, I thought I was proposing something like that but it can't be tacked on later I don't think - needs to be an inate part of Python to work as cleanly as 4gl languages. Re: your named tuple suggestion, wouldn't that mean that the naming is divorced from the result column names - that is part of what shouldn't be. Re:Everything being true of false. I don't see the value of that. Only boolean data should be valid in boolean contexts. I don't really see how that can be argued. On 09/01/17 21:31, python-ideas-request at python.org wrote: > Send Python-ideas mailing list submissions to > python-ideas at python.org > > To subscribe or unsubscribe via the World Wide Web, visit > https://mail.python.org/mailman/listinfo/python-ideas > or, via email, send a message with subject or body 'help' to > python-ideas-request at python.org > > You can reach the person managing the list at > python-ideas-owner at python.org > > When replying, please edit your Subject line so it is more specific > than "Re: Contents of Python-ideas digest..." > > > Today's Topics: > > 1. Re: PEP 540: Add a new UTF-8 mode (INADA Naoki) > 2. Python Reviewed (Simon Lovell) > 3. Re: Python Reviewed (Chris Angelico) > > > ---------------------------------------------------------------------- > > Message: 1 > Date: Mon, 9 Jan 2017 11:21:41 +0900 > From: INADA Naoki <songofacandy at gmail.com> > To: "Stephen J. Turnbull" <turnbull.stephen.fw at u.tsukuba.ac.jp> > Cc: Victor Stinner <victor.stinner at gmail.com>, python-ideas > <python-ideas at python.org> > Subject: Re: [Python-ideas] PEP 540: Add a new UTF-8 mode > Message-ID: > <CAEfz+TwaVHaKnyquXuUqBMk=AyUcwDMgyA8efuhU9=oMhaGZnQ at mail.gmail.com> > Content-Type: text/plain; charset=UTF-8 > > On Sun, Jan 8, 2017 at 1:47 AM, Stephen J. Turnbull > <turnbull.stephen.fw at u.tsukuba.ac.jp> wrote: >> INADA Naoki writes: >> >> > I want UTF-8 mode is enabled by default (opt-out option) even if >> > locale is not POSIX, >> > like `PYTHONLEGACYWINDOWSFSENCODING`. >> > >> > Users depends on locale know what locale is and how to configure it. >> > They can understand difference between locale mode and UTF-8 mode >> > and they can opt-out UTF-8 mode. >> > But many people lives in "UTF-8 everywhere" world, and don't know >> > about locale. >> >> I find all this very strange from someone with what looks like a >> Japanese name. I see mojibake and non-Unicode encodings around me all >> the time. Caveat: I teach at a University that prides itself on being >> the most international of Japanese national universities, so in my >> daily work I see Japanese in 4 different encodings (5 if you count the >> UTF-16 used internally by MS Office), Chinese in 3 different (claimed) >> encodings, and occasionally Russian in at least two encodings, ..., >> uh, I could go on but won't. In any case, the biggest problems are >> legacy email programs and busted websites in Japanese, plus email that >> is labeled "GB2312" but actually conforms to GBK (and this is a reply >> in Japanese to a Chinese applicant writing in Japanese encoded as GBK). > Since I work on tech company, and use Linux for most only "server-side" program, > I don't live such a situation. > > But when I see non UTF-8 text, I don't change locale to read such text. > (Actually speaking, locale doesn't solve mojibake because it doesn't change > my terminal emulator's encoding). > And I don't change my terminal emulator setting only for read such a text. > What I do is convert it to UTF-8 through command like `view > text-from-windows.txt ++enc=cp932` > > So there are no problem when Python always use UTF-8 for fsencoding > and stdio encoding. > >> I agree that people around me mostly know only two encodings: "works >> for me" and "mojibake", but they also use locales configured for them >> by technical staff. On top of that, international students (the most >> likely victims of "UTF-8 by default" because students are the biggest >> Python users) typically have non-Japanese locales set on their >> imported computers. > Hmm, Which OS do they use? There are no problem in macOS and Windows. > Do they use Linux with locale with encoding other than UTF-8, and > their terminal emulator > uses non-UTF-8 encoding? > > As my feeling, UTF-8 start dominating from about 10 years ago, and > ja_JP.EUC_JP (it was most common locale for Japanese befoer UTF-8) is > complete legacy. > > There is only one machine (which is in LAN, lives from 10+ years ago, > /usr/bin/python is Python 1.5!), > I can ssh which has ja_JP.eucjp locale. > > > ------------------------------ > > Message: 2 > Date: Mon, 9 Jan 2017 19:25:45 +0800 > From: Simon Lovell <simon58500 at bigpond.com> > To: python-ideas at python.org > Subject: [Python-ideas] Python Reviewed > Message-ID: <69e3c5d4-d64b-063e-758e-2b0ac1720daa at bigpond.com> > Content-Type: text/plain; charset=utf-8; format=flowed > > Python Reviewed > > Having used a lot of languages a little bit and not finding satisfactory > answers to these in some cases often asked questions, I thought I'd join > this group to make a post on the virtues and otherwise of python. > > The Good: > Syntactically significant new lines > Syntactically significant indenting > Different types of array like structures for different situations > Mostly simple and clear structures > Avoiding implicit structures like C++ references which add only > negative value > Avoiding overly complicated chaining expressions like > "while(*d++=*s++);" > Single syntax for block statements (well, sort of. I'm ignoring > lines like "if a=b: c=d") > Lack of a with statement which only obscures the code > > > The Bad: > Colons at the end of if/while/for blocks. Most of the arguments in > favour of this decision boil down to PEP 20.2 "Explicit is better than > implicit". Well, no. if/while/for blocks are already explicit. Adding > the colon makes it doubly explicit and therefore redundant. There is no > reason I can see why this colon can't be made optional except for > possibly PEP20.13 "There should be one-- and preferably only one > --obvious way to do it". I don't agree that point is sufficient to > require colons. > > > No end required for if/while/for blocks. This is particularly a > problem when placing code into text without fixed width fonts. It also > is a potential problem with tab expansion tricking the programmer. This > could be done similarly to requiring declarations in Fortran, which if > "implicit none" was added to the top of the program, declarations are > required. So add a "Block Close Mandatory" (or similar) keyword to > enforce this. In practice there is usually a blank line placed at the > end of blocks to try to signal this to someone reading the code. Makes > the code less readable and I would refer to PEP20.7 "Readability counts" > > > This code block doesn't compile, even given that function "process" > takes one string parameter: > f=open(file) > endwhile="" > while (line=f.readline())!=None: > process(line) > endwhile > > I note that many solutions have been proposed to this. In C, it > is the ability to write "while(line=fgets(f))" instead of > "while((line=fgets(f))!=NULL)" which causes the confusion. No solutions > have been accepted to the current method which is tacky: > f=open(file) > endwhile="" > endif="" > while True: > line=f.readline > if line = None: > break > endif > process(line) > endwhile > > > Inadequacy of PEP249 - Python Database Specification. This only > supports dynamic SQL but SQL and particularly select statements should > be easier to work with in the normal cases where you don't need such > statements. e.g: > endselect="" > idList = select from identities where surname = 'JONES': > idVar = id > forenameVar = forename > surnameVar = surname > dobVar = dob > endselect > > endfor="" > for id in idList: > print id.forenameVar, id.dobVar > endfor > > as opposed to what is presently required in the select case > which is: > curs = connection.cursor() > curs.execute("select id, forename, surname, dob from > identities where surname = 'JONES'") > idList=curs.fetchall() > > endfor="" > for id in idList: > print id[1], id[3] > endfor > > I think the improvement in readibility for the first option > should be plain to all even in the extremely simple case I've shown. > > This is the sort of thing which should be possible in any > language which works with a database but somehow the IT industry has > lost it in the 1990s/2000s. Similarly an upgraded syntax for the > insert/values statement which the SQL standard has mis-specified to make > the value being inserted too far away from the column name. Should be > more like: > endinsert="" > Insert into identities: > id = 1 > forename = 'John' > surname = 'Smith' > dob = '01-Jan-1970' > endinsert > > One of the major problems with the status quo is the lack of > named result columns. The other is that the programmer is required to > convert the where clause into a string. The functionality of dynamic > where/from clauses can still be provided without needing to rely on > numbered result columns like so: > endselect="" > idList = select from identities where :where_clause: > id = id > forename = forename > surname = surname > dob = dob > endselect > > Ideally, the bit after the equals sign would support all > syntaxes allowed by the host database server which probably means it > needs to be free text passed to the server. Where a string variable > should be passed, the :variable syntax could be supported but this is > not often required > > > Variables never set to anything do not error until they are used, > at least in implementations of Python 2 I have tried. e.g. > UnlikelyCondition = False > endif="" > if UnlikelyCondition: > print x > endif > > The above code runs fine until UnlikelyCondition is set to True > > > No do-while construct > > > else keyword at the end of while loops is not obvious to those not > familiar with it. Something more like whenFalse would be clearer > > > Changing print from a statement to a function in Python 3 adds no > positive value that I can see > > > Upper delimiters being exclusive while lower delimiters are > inclusive. This is very counter intuitive. e.g. range(1,4) returns > [1,2,3]. Better to have the default base as one rather than zero IMO. Of > course, the programmer should always be able to define the lower bound. > This cannot be changed, of course. > > > Lack of a single character in a method to refer to an attribute > instead of a local variable, similar to C's "*" for dereferencing a pointer > > > Inability to make simple chained assignments e.g. "a = b = 0" > > > Conditional expression (<true-value> if <condition> else > <false-value>) in Python is less intuitive than in C (<condition> ? > <true-value> : <false-value>). Ref PEP308. Why BDFL chose the syntax he > did is not at all clear. > > > The Ugly: > Persisting with the crapulence from C where a non zero integer is > true and zero is false - only ever done because C lacked a boolean data > type. This is a flagrant violation of PEP 20.2 "Explicit is better than > implicit" and should be removed without providing backwards compatibility. > > > > ------------------------------ > > Message: 3 > Date: Tue, 10 Jan 2017 00:31:42 +1100 > From: Chris Angelico <rosuav at gmail.com> > To: python-ideas <python-ideas at python.org> > Subject: Re: [Python-ideas] Python Reviewed > Message-ID: > <CAPTjJmrTfYup+o7BYwnYB=yCbLof3Csq0CcNU36ke8J5ynb5QA at mail.gmail.com> > Content-Type: text/plain; charset=UTF-8 > > On Mon, Jan 9, 2017 at 10:25 PM, Simon Lovell <simon58500 at bigpond.com> wrote: >> Python Reviewed >> >> Having used a lot of languages a little bit and not finding satisfactory >> answers to these in some cases often asked questions, I thought I'd join >> this group to make a post on the virtues and otherwise of python. > I think this thread belongs on python-list at python.org, where you'll > find plenty of people happy to discuss why Python is and/or shouldn't > be the way it is. > > A couple of responses to just a couple of your points. > >> The Good: >> Syntactically significant new lines >> Syntactically significant indenting >> The Bad: >> No end required for if/while/for blocks. This is particularly a problem >> when placing code into text without fixed width fonts. It also is a >> potential problem with tab expansion tricking the programmer. > If indentation and line endings are significant, you shouldn't need > end markers. They don't buy you anything. In any case, I've never > missed them; in fact, Python code follows the "header and lines" > concept that I've worked with in many, MANY data files for decades > (think of the sectioned config file format, for example). > >> This code block doesn't compile, even given that function "process" >> takes one string parameter: >> f=open(file) >> endwhile="" >> while (line=f.readline())!=None: >> process(line) >> endwhile >> >> I note that many solutions have been proposed to this. In C, it is >> the ability to write "while(line=fgets(f))" instead of >> "while((line=fgets(f))!=NULL)" which causes the confusion. No solutions have >> been accepted to the current method which is tacky: >> f=open(file) >> endwhile="" >> endif="" >> while True: >> line=f.readline >> if line = None: >> break >> endif >> process(line) >> endwhile > Here's a better way: > > for line in open(file): > process(line) > > If you translate C code to Python, sure, it'll sometimes come out even > uglier than the C original. But there's often a Pythonic way to write > things. > >> Inadequacy of PEP249 - Python Database Specification. This only supports >> dynamic SQL but SQL and particularly select statements should be easier to >> work with in the normal cases where you don't need such statements. e.g: >> endselect="" >> idList = select from identities where surname = 'JONES': >> idVar = id >> forenameVar = forename >> surnameVar = surname >> dobVar = dob >> endselect >> >> endfor="" >> for id in idList: >> print id.forenameVar, id.dobVar >> endfor > You're welcome to propose something like this. I suspect you could > build an SQL engine that uses a class to create those bindings - > something like: > > class people(identities): > id, forename, surname, dob > where="surname = 'JONES'" > > for person in people: > print(person.forename, person.dob) > > Side point: "forename" and "surname" are inadvisable fields. > http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ > >> One of the major problems with the status quo is the lack of named >> result columns. The other is that the programmer is required to convert the >> where clause into a string. The functionality of dynamic where/from clauses >> can still be provided without needing to rely on numbered result columns >> like so: >> endselect="" >> idList = select from identities where :where_clause: >> id = id >> forename = forename >> surname = surname >> dob = dob >> endselect > That's easy enough to do with a namedtuple. > >> Variables never set to anything do not error until they are used, at >> least in implementations of Python 2 I have tried. e.g. >> UnlikelyCondition = False >> endif="" >> if UnlikelyCondition: >> print x >> endif >> >> The above code runs fine until UnlikelyCondition is set to True > That's because globals and builtins could be created dynamically. It's > a consequence of not having variable declarations. You'll find a lot > of editors/linters will flag this, though. > >> Changing print from a statement to a function in Python 3 adds no >> positive value that I can see > Adds heaps of positive value to a lot of people. You simply haven't > met the situations where it's better. It's sufficiently better that I > often use __future__ to pull it in even in 2.7-only projects. > >> Lack of a single character in a method to refer to an attribute instead >> of a local variable, similar to C's "*" for dereferencing a pointer > Ehh. "self." isn't that long. Python isn't AWK. > >> Inability to make simple chained assignments e.g. "a = b = 0" > Really? Works fine. You can chain assignment like that. > >> Conditional expression (<true-value> if <condition> else <false-value>) >> in Python is less intuitive than in C (<condition> ? <true-value> : >> <false-value>). Ref PEP308. Why BDFL chose the syntax he did is not at all >> clear. > I agree with you on this one - specifically, because the order of > evaluation is "middle then outside", instead of left-to-right. > >> The Ugly: >> Persisting with the crapulence from C where a non zero integer is true >> and zero is false - only ever done because C lacked a boolean data type. >> This is a flagrant violation of PEP 20.2 "Explicit is better than implicit" >> and should be removed without providing backwards compatibility. > In Python, *everything* is either true or false. Anything that > represents "something" is true, and anything that represents "nothing" > is false. An empty list is false, but a list with items in it is true. > This is incredibly helpful and most definitely not ugly; Python is not > REXX. > > ChrisA > > > ------------------------------ > > Subject: Digest Footer > > _______________________________________________ > Python-ideas mailing list > Python-ideas at python.org > https://mail.python.org/mailman/listinfo/python-ideas > > > ------------------------------ > > End of Python-ideas Digest, Vol 122, Issue 20 > *********************************************
- Previous message (by thread): [Python-ideas] Python Reviewed
- Next message (by thread): [Python-ideas] Python reviewed
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-ideas mailing list