[Tutor] Another set question

2017-04-28 Thread Phil
I'm trying to implement a conditional branch based on a variable type.
For example, if c is a character and s is a set with only one member.

c = "9"
s ={9}

if type(c) == a string:
do this
else:
do that

An alternative that I've attempted is to test if a set contains one member 
based on len(). However, I then cannot tell if len() is referring to a single 
character or a single set with one member. So I'm back to square one.

A for loop is indexing mixed lists of characters (one character per list) and 
lists that a set with one member. I'm only interested in the sets and want to 
ignore the character lists.

I have come up with a method that will probably work but it's become quite 
messy with multiple compare statements. Something simple and less prone to 
cause headaches would be better.
 
-- 
Regards,
Phil
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Another set question

2017-04-28 Thread Ben Finney
Phil  writes:

> I'm trying to implement a conditional branch based on a variable type.

This is often (not always) a mistake, in Python. So the question needs
to be asked: What makes you think that condition is a requirement?

In other words, why is the data such that you *need* to know whether it
is a set versus a string, before using it? Can the data be handled
differently such that the condition you describe isn't a prerequisite?

> For example, if c is a character and s is a set with only one member.

Note that “a character” and “an empty string” and “three characters” are
all values that have the exact same type: the ‘str’ type.

Similarly, “a set with only one member” and “a set with two dozen
members” and “an empty set” are all values that are of the same type:
the ‘set’ type.

So, I suspect you will need to explain better what larger problem you
are trying to solve, and re-consider whether the condition you're trying
to test is actually going to help that purpose.

-- 
 \ “Pinky, are you pondering what I'm pondering?” “I think so, |
  `\Brain, but this time *you* put the trousers on the chimp.” |
_o__)   —_Pinky and The Brain_ |
Ben Finney

___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Another set question

2017-04-28 Thread Martin A. Brown

Hello and greetings Phil,

>> I'm trying to implement a conditional branch based on a variable type.
>
>This is often (not always) a mistake, in Python. So the question needs
>to be asked: What makes you think that condition is a requirement?
>
>So, I suspect you will need to explain better what larger problem you
>are trying to solve, and re-consider whether the condition you're trying
>to test is actually going to help that purpose.

I will echo what Ben has said.  As I thought about your question, I 
began to wonder more about what problem you were trying to solve 
than the question you are actually asking.

Here are some thoughts I can suggest.  We might be able to offer 
other suggestions if we know the problem you were tackling, 
although, of course, sometimes it is most fun/learning/challenging 
to discover these things for yourself.

Anyway, on to the thoughts:

  * Do you know about isinstance? [0] Be careful using this, as it 
is easy to use it poorly.  Look up duck-typing [1] and see if 
that helps in your solution.  The main point is to understand 
what's possible with an object/instance not what type it is.

  * More basically, are you familiar with "in" keyword (reserved 
word in Python)?  For any Python sequence, a list, tuple, set 
and other such, you can test membership using "x in mysequence".
Of course, it works on sequences, and strings are also sequences 
(as you appear to have discovered), so this would require some 
care.  See the docs for operations on sequences [2].  You might 
be able to change your problem to using the "x in y" technique.

  * Finally, are you transforming your data before you operate on 
it?  Based on your earlier question, I suspect you may not be 
doing that.  One way to avoid headaches when you are operating 
on data inside a program is to transform that data to the 
expected datatypes as early as possible on input and then 
transform that data as late as possible on output.

Why do many programmers do this?  This means that inside the 
program, you have some sort of contract about the datatypes on 
which your program is operating.  There's no doubt about whether 
a particular function is operating on an integer or a string.  
For statically typed languages this is de rigeur.  For 
dynamically typed languages like Python, you can elect not to do 
this, but sometimes it will bite you, if you aren't careful. 
Of course, you should take advantage of the dynamism, but 
remember to consider either A) puttingthe data into an 
internally canonical form before passing it around (my 
preference) or writing your funtions / methods to deal with
multiple datatypes.

>> For example, if c is a character and s is a set with only one member.
>
>Note that “a character” and “an empty string” and “three characters” are
>all values that have the exact same type: the ‘str’ type.
>
>Similarly, “a set with only one member” and “a set with two dozen
>members” and “an empty set” are all values that are of the same type:
>the ‘set’ type.

Simple example using "isinstance":

  # -- create a list of sets and one-character strings
  #
  l = [ set(("9")), "a", "b", "c", set(("q"))]
  
  # -- create a list with only the things that are of type set
  #
  q = [x for x in l if isinstance(x, set)]

  # Now, q = [{'9'}, {'q'}]

Example of using "in":

>In other words, why is the data such that you *need* to know whether it
>is a set versus a string, before using it? Can the data be handled
>differently such that the condition you describe isn't a prerequisite?

And, this is the key question.

Good luck!

-Martin

 [0] https://docs.python.org/3/library/functions.html#isinstance
 [1] http://www.voidspace.org.uk/python/articles/duck_typing.shtml
 [2] 
https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range

-- 
Martin A. Brown
http://linux-ip.net/
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor