3 ms·
In Python: ["a", "b"].join(" ") This would mean the type list has a method join, how would it work with the following ? [1.5, "hello", None].join(" ")
by linkdd 6y ago
In Python:
["a", "b"].join(" ")
This would mean the type list has a method join, how would it work with the following ?
[1.5, "hello", None].join(" ")
- rgoulter 6y ago>>> " ".join([1.5, "hello", None]) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: sequence item 0: expected string, float found Why would `[1.5, "hello", None].join(" ")` be any different?
- linkdd 6y agoBecause "list of string" is not a type in Python. Why would you put a method on a class if only a small subset of it can use it?
- Mathnerd314 6y agoThat happens all the time, since Python is dynamically typed. For example a[10] gives an IndexError if a has less than 11 elements. So with static typing, we should restrict indexing to ensure that the number of elements needed are present, and remove indexing from general lists. But you wouldn't remove indexing from lists, that's one of the main functions...
- matt_kantor 6y agoEither way it's a partial function that is not defined for most of its domain. The only difference is how its arguments (including self) get arranged at call sites, right?
- pmontra 6y agoPrinciple of least surprise: make it work like >>> f"{1.5} {'hello'} {None}" '1.5 hello None' Ruby does that. From [1] "[Array#join] Returns a string created by converting each element of the array to a string, separated by the given separator." The difference is that nil (Ruby's None) disappears 2.6.5 :001 > [1.5, "hello", nil].join(" ") => "1.5 hello " That's totally expected because in Ruby the conversion of nil into a string is the empty string. Python converts it into the string "None". [1] https://ruby-doc.org/core-2.6.5/Array.html#method-i-join https://ruby-doc.org/core-2.6.5/Array.html#method-i-join Edit: an example with a type that normally wouldn't meaningfully cast to string 2.6.5 :001 > class Example 2.6.5 :002?> attr_accessor :name 2.6.5 :003?> end => nil 2.6.5 :004 > e = Example.new => #<Example:0x000055a321fa2bb0> 2.6.5 :005 > e.name = "example" => "example" 2.6.5 :006 > e.to_s => "#<Example:0x000055a321fa2bb0>" 2.6.5 :007 > [1, e].join(" ") => "1 #<Example:0x000055a321fa2bb0>" 2.6.5 :008 > class Example 2.6.5 :009?> attr_accessor :name 2.6.5 :010?> def to_s 2.6.5 :011?> "#{name}" 2.6.5 :012?> end 2.6.5 :013?> end => :to_s 2.6.5 :014 > e = Example.new => #<Example:0x000055a321f8a4c0> 2.6.5 :015 > e.name = "example" => "example" 2.6.5 :016 > e.to_s => "example" 2.6.5 :017 > [1, e].join(" ") => "1 example"