29

Can I use type as a name for a python function argument?

def fun(name, type):
    ....
2
  • The name category can work well if you really don't feel like specifying type of what, such as in foo_type. Commented Aug 25, 2016 at 2:33
  • 2
    I would use kind instead of type. The dictionary definitions for this context are almost identical. Commented Jan 20, 2019 at 21:03

5 Answers 5

48

You can, but you shouldn't. It's not a good habit to use names of built-ins because they will override the name of the built-in in that scope. If you must use that word, modify it slightly for the given context.

While it probably won't matter for a small project that is not using type, it's better to stay out of the habit of using the names of keywords/built-ins. The Python Style Guide provides a solution for this if you absolutely must use a name that conflicts with a keyword:

single_trailing_underscore_: used by convention to avoid conflicts with Python keyword, e.g.

Tkinter.Toplevel(master, class_='ClassName')
Sign up to request clarification or add additional context in comments.

5 Comments

BTW, since type is such a generic, oft' overused word, adding a qualifer as in "car_type" or "animal_type" makes for a more self-documenting program anyway
i used to use tipe, but I always hated the way it looked. now I use typ
@Bloke, i think it make sense to name it like typ. If u have a class car, u don't want to have a property car_type. A language shouldn't steal generic names.
Extending the advice from PEP 8 to cover builtins, you could use type_
I agree with all others about style. Here is a counter example for more context. From the official python docs: sys.excepthook(type, value, traceback) docs.python.org/3/library/sys.html#sys.excepthook
8

You can, and that's fine. Even though the advice not to shadow builtins is important, it applies more strongly if an identifier is common, as it will increase confusion and collision. It does not appear type will cause confusion here (but you'll know about that more than anyone else), and I could use exactly what you have.

1 Comment

+1 for mentioning potential confusion. I think that's a much bigger issue than the technical problem of possibly shadowing a builtin: someone reading the code (even possibly the person who wrote it) might expect type to refer to the builtin. The chances of accidentally shadowing the builtin type seem small in comparison: it's not used all that often in real code.
5

You can use any non-keyword as an identifier (as long as it's a valid identifier of course). type is not a keyword, but using it will shadow the type built-in.

Comments

2

You can, but you would be masking the built-in name type. So it's better not to do that.

Comments

0

You can use _type for that. For example:

def foo(_type):
    pass

If you use type, you can't use type() in that function. For example:

>>> type('foo')
<type 'str'>
>>> type = 'bar'
>>> type('foo')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'str' object is not callable

1 Comment

It would probably be better to use type_, like PEP 8 recommends for avoiding conflicts with keywords

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.