Path: csiph.com!newsfeed.hal-mli.net!feeder3.hal-mli.net!newsfeed.hal-mli.net!feeder1.hal-mli.net!newsfeed.xs4all.nl!newsfeed2.news.xs4all.nl!xs4all!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.001 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; 'interfaces': 0.04; 'subject:Python': 0.06; 'parser': 0.07; 'chunk': 0.09; 'comment,': 0.09; 'english,': 0.09; 'exception,': 0.09; 'indicates': 0.09; 'python:': 0.09; 'sake': 0.09; 'scripting': 0.09; 'url:github': 0.09; 'python': 0.11; 'mostly': 0.14; 'random': 0.14; "wouldn't": 0.14; '(same': 0.16; 'ast': 0.16; 'categories,': 0.16; 'clear.': 0.16; 'elsewhere.': 0.16; 'from:addr:rosuav': 0.16; 'from:name:chris angelico': 0.16; 'gem': 0.16; "module's": 0.16; 'referencing': 0.16; 'roy': 0.16; 'smattering': 0.16; 'sqlite': 0.16; 'stats': 0.16; 'subject: \n ': 0.16; 'this)': 0.16; 'index': 0.16; 'thursday,': 0.16; ':-)': 0.16; 'do,': 0.16; 'language': 0.16; 'wrote:': 0.18; 'library': 0.18; 'bit': 0.19; 'module': 0.19; 'basically': 0.19; '(the': 0.22; 'code,': 0.22; '(in': 0.22; "aren't": 0.24; 'large,': 0.24; 'lets': 0.24; 'module,': 0.24; 'requirement.': 0.24; 'subject:community': 0.24; 'fairly': 0.24; 'fine': 0.24; 'environment': 0.24; "i've": 0.25; '2.0': 0.26; 'compare': 0.26; 'references': 0.26; 'this:': 0.26; 'least': 0.26; 'header:In-Reply-To:1': 0.27; 'installed': 0.27; 'idea': 0.28; 'chris': 0.29; 'external': 0.29; 'skip:p 30': 0.29; 'am,': 0.29; 'mix': 0.30; 'especially': 0.30; 'message-id:@mail.gmail.com': 0.30; "i'm": 0.30; 'code': 0.31; 'getting': 0.31; 'that.': 0.31; 'are.': 0.31; 'description,': 0.31; 'name;': 0.31; 'pickle': 0.31; 'probably': 0.32; 'languages': 0.32; 'interface': 0.32; 'quite': 0.32; 'becomes': 0.33; 'framework': 0.33; 'fri,': 0.33; 'packaging': 0.33; 'used,': 0.33; 'updated': 0.34; 'skip:d 20': 0.34; 'subject:the': 0.34; 'basic': 0.35; "can't": 0.35; 'skip:u 20': 0.35; 'something': 0.35; 'but': 0.35; 'received:google.com': 0.35; 'there': 0.35; 'really': 0.36; 'doing': 0.36; 'subject:?': 0.36; 'should': 0.36; 'searching': 0.37; 'too': 0.37; 'list': 0.37; 'level': 0.37; 'clear': 0.37; 'easily': 0.37; 'whatever': 0.38; 'to:addr:python-list': 0.38; 'little': 0.38; 'anything': 0.39; 'does': 0.39; 'use.': 0.39; 'to:addr:python.org': 0.39; 'mailing': 0.39; 'skip:p 20': 0.39; 'skip:u 10': 0.60; 'read': 0.60; 'guy': 0.60; 'is.': 0.60; 'most': 0.60; 'numbers': 0.61; 'first': 0.61; 'name': 0.63; 'high': 0.63; 'more': 0.64; 'linked': 0.65; 'talking': 0.65; 'charset:windows-1252': 0.65; 'smith': 0.68; 'sound': 0.68; 'results': 0.69; 'internet': 0.71; 'clicking': 0.73; 'special': 0.74; 'honest': 0.78; 'around,': 0.84; 'confusing': 0.84; 'etc),': 0.84; 'fish': 0.84; 'off,': 0.84; 'pike': 0.84; 'precious': 0.84; 'stat': 0.84; 'url:master': 0.84; 'mean.': 0.91; '2013': 0.98 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type:content-transfer-encoding; bh=3CSTQlmJxfIHz8YR0OtjPqhC+b7qtfgo30zvCgc+eX4=; b=FtbL7VqxL3TFkQAMk8CuGHf5UFpsz39Eop8OD+HWZh9d0QlZMCxeuxWtLGuKpV4fLF 5Xmi9wc+HHU/v8dtECh2bSDsRhd4XU9THeIAFEzu6bphprH5FMJzFlvq5+qzqUmsGXWu vOQV6Jt9b9Hg/GELCFzOSctAdDgJi2SXiMT9FfhHU/vyxAt6g7HrAs8lB8nGaqRfUzv8 lL1Xp4tq+BUjKMX80NNSpMwVmtmh4QzSPquq7BpERNBqhdlvc6hHx+ibT8zD73tOuiLN qFx81PrBfd8JN1K/XTZRwYgXQU8d/lZs2UELio5J93ms3bScbqS0XgV/i4A0JieBgsia /XAA== MIME-Version: 1.0 X-Received: by 10.68.76.65 with SMTP id i1mr10861186pbw.37.1382050575182; Thu, 17 Oct 2013 15:56:15 -0700 (PDT) In-Reply-To: References: <2013101623133337485-owenjacobson@grimoireca> Date: Fri, 18 Oct 2013 09:56:15 +1100 Subject: Re: Sexism in the Ruby community: how does the Python community manage it? From: Chris Angelico To: python-list@python.org Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 115 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1382050591 news.xs4all.nl 15872 [2001:888:2000:d::a6]:50486 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:57000 On Fri, Oct 18, 2013 at 4:16 AM, Roy Smith wrote: > On Thursday, October 17, 2013 11:07:48 AM UTC-4, Chris Angelico wrote: >> Module names should be descriptive, not fancy. > > Interesting comment, on a mailing list for a language named after a snake= , especially by a guy who claims to prefer an language named after a fish := -) Heh, I do see the irony, but here's the deal: You have to get to know a language somewhat before you can make an honest appraisal of it, and that means knowing a lot more than its name. But you should be able to know broadly what a module does based on its name, so that when you see references to the module name in code, you have at least some idea of what's going on. Here's a smattering of Python module names, from the standard library: 8.1. datetime =97 Basic date and time types 8.11. pprint =97 Data pretty printer 9.6. random =97 Generate pseudo-random numbers 11.3. stat =97 Interpreting stat() results 12.6. sqlite3 =97 DB-API 2.0 interface for SQLite databases All of them make it very clear what they're doing. Okay, so you can't really learn much about sqlite3 other than that it interfaces with sqlite3, whatever that is. If you had a module named "alsa", you wouldn't know that that's a way of playing sound unless you know what ALSA is elsewhere. But they're still linked fairly clearly with what they do, on some level of "do". There are a few dodgier ones: 12.1. pickle =97 Python object serialization (flavorful, fine once you know it, but a little unintuitive) 22.5. chunk =97 Read IFF chunked data (heaps of things are chunked, but calling it "iff" would have been just as confusing so there's probably no solution to this) but, especially in networking, you can easily find what you want based on an external requirement. Try searching the docs index for any internet protocol name; if you get a hit, chances are very high that it's a module that supports that. ("ip" is an exception, but "ipv4" or "ipv6" will get you to the ipaddress module's description, at least.) Pike is similar. Again, a few dodgy ones in the mix ("Remote" is an RPC module, quite a few are buried inside a package like "Protocols" or "Standards", etc), but by and large, module names follow the "Truly Scrumptious" principle of sounding like what they are. Now, to be fair, I should look at pypi.python.org and modules.gotpike.org to compare against Ruby gems. Unfortunately I can't pinpoint usage stats of any sort, but I can (in each case) get a list of the most recently updated packages/modules, so hopefully the packages that get updates are the ones people use. Python: django-tornado iso8601 fjd mozilla-logger dexy vodafone-scraper ipwhois cashew django-subdomains-handler usethis-django-bootstrap A few dodgy ones (I don't know what cashew does without clicking its link), but mostly they're pretty descriptive. Pike modules are organized into categories, which makes it too easy: Public.Network.Pcap Public.Tools.Language.Hyphenate Database.EJDB Public.Protocols.Jabber Database.MongoDB (The "Public" part is a packaging recommendation, and can basically be ignored.) There are dodgy names around, though none have come up in the five-most-recent-edits list here. Now here's what I'm talking about, with Ruby. First off, any reference to "gems" or precious stones in any way is given a special pass, because of the environment (same as anything referencing Monty Python would be in Python - it's not fair to compare against those). Some of the names are descriptive: mail i18n tzinfo coffee-script jquery-rails But some are less clear: nokogiri - an HTML/XML/etc parser (might mean something if I knew Japanese, but all the docs are in English, so the name is a bit orphanned; most languages prefer to name things in English, as it's more internationally recognized) arel - an "SQL AST manager" ?? cocaine - "A small library for doing (command) lines" deface - lets you "customize ERB, Haml and Slim views" polyamorous - though the description indicates that it's somewhat internal therubyracer - interfaces with V8, the javascript engine thor - "A scripting framework that replaces rake, sake and rubigen" I know that all these are used, because they're all dependencies of a particular gem I've used at work (Spree), and I got the list by eyeballing this: https://github.com/spree/spree_base_1_2/blob/master/Gemfile.lock Most of them are names that I've seen getting installed during a Spree installation. This is what I mean. When module names aren't descriptive, code becomes less clear. When language names aren't descriptive, very little suffers. ChrisA