Чтобы расширить и сделать из этого ответ:
Нет, вы не должны этого делать.
- Изменяет функциональность, которую люди ожидают от строк.
- Это означает дополнительные накладные расходы по всей вашей программе.
- Это в основном не нужно.
- Проверка типов очень не пифонична.
Вы можете сделать это, и методы, которые вы указали, являются, вероятно, лучшими способами ( для записи, я думаю, что подклассификация - лучший вариант Если вы должны это сделать, см. Метод @ kindall ) но это просто не стоит делать, и это не очень питонично. Избегайте ошибок в первую очередь. В вашем примере вы, возможно, захотите спросить себя, является ли это проблемой с ясностью ваших аргументов, и могут ли именованные аргументы или восклицательный знак быть лучшим решением.
Например: изменить порядок.
def set_fields(record, value, *fields):
for f in fields:
record[f] = value
set_fields(weapon1, 'Dagger', *('Name', 'ShortName')) #If you had a tuple you wanted to use.
set_fields(weapon2, 'Katana', 'Name')
set_fields(weapon3, 'Wand', 'Name')
Eg: Именованные аргументы.
def set_fields(record, fields, value):
for f in fields:
record[f] = value
set_fields(record=weapon1, fields=('Name', 'ShortName'), value='Dagger')
set_fields(record=weapon2, fields=('Name'), value='Katana')
set_fields(record=weapon3, fields='Name', value='Wand') #I find this easier to spot.
Если вы действительно хотите, чтобы порядок был таким же, но не думаете, что идея названных аргументов достаточно ясна, тогда как насчет того, чтобы сделать каждую запись похожим на диктат, а не на диктант (если это еще не сделано) и иметь :
class Record:
...
def set_fields(self, *fields, value):
for f in fileds:
self[f] = value
weapon1.set_fields("Name", "ShortName", value="Dagger")
Единственная проблема здесь - введенный класс и тот факт, что значение параметра должно быть сделано с ключевым словом, хотя оно и остается ясным.
В качестве альтернативы, если вы используете Python 3, у вас всегда есть возможность использовать расширенную распаковку кортежей:
def set_fields(*args):
record, *fields, value = args
for f in fields:
record[f] = value
set_fields(weapon1, 'Name', 'ShortName', 'Dagger')
set_fields(weapon2, 'Name', 'Katana')
set_fields(weapon3, 'Name', 'Wand')
Или, для моего последнего примера:
class Record:
...
def set_fields(self, *args):
*fields, value = args
for f in fileds:
self[f] = value
weapon1.set_fields("Name", "ShortName", "Dagger")
Однако при чтении вызовов функций они оставляют некоторую странность, поскольку обычно предполагается, что аргументы не будут обрабатываться таким образом.