Передача аргументов по умолчанию для функций в Python

Новичок здесь, поэтому, пожалуйста, будьте нежны. Я работаю с сетками, и у меня есть набор неизменяемых списков (кортежей), которые содержат атрибуты исходной входной сетки. Эти списки, а также исходная сетка используются в качестве организационного руководства для отслеживания вновь созданных подсетей; т. е. поскольку вложенные сетки ссылаются на исходную сетку, ее атрибуты (списки) могут использоваться для ссылки между промежуточными ячейками или для создания вложенных подсетей. Ниже приведены структуры некоторых из этих списков:

vertices = [ (coordinate of vertex 1), ... ]
faceNormals = [ (components of normal of face 1), ...]
faceCenters = [ (coordinates of barycenter of face 1), ...]

Так как я не знаком с oop, я организовал свой сценарий так:

def main():
    meshAttributes = GetMeshAttributes()
    KMeans(meshAttributes, number_submeshes, number_cycles)

def GetMeshAttributes()
def Kmeans():
    func1
    func2
    ...
def func1()
def func2()
...
main()

Проблема в том, что в каждой функции внутри KMeans мне нужно передать некоторые атрибуты сетки в качестве аргументов, и я не могу использовать их по умолчанию, потому что они неизвестны в начале скрипта. Например, внутри Kmeans есть функция CreateSeeds:

def CreateSeeds(mesh, number_submeshes, faceCount, vertices, faceVertexIndexes):

Последние три аргумента являются статическими, но я не могу сделать что-то вроде:

CreateSeeds(mesh, number_submeshes)

потому что я должен был бы разместить faceCount, vertices, faceVertexIndexes внутри определения функции, и этот список вначале огромен и неизвестен.

Я пытался использовать классы, но в моих ограниченных знаниях у меня была та же проблема. Может ли кто-нибудь дать мне несколько советов о том, где искать решение?

Спасибо!

1 ответ

Решение

Что вы хотите, чтобы получить partial функция приложения:

>>> from functools import partial
>>> def my_function(a, b, c, d, e, f):
...     print(a, b, c, d, e, f)
... 
>>> new_func = partial(my_function, 1, 2, 3)
>>> new_func('d', 'e', 'f')
1 2 3 d e f

Если вы хотите указать последние параметры, вы можете использовать ключевые аргументы или lambda:

>>> new_func = partial(my_function, d=1, e=2, f=3)
>>> new_func('a', 'b', 'c')
a b c 1 2 3
>>> new_func = lambda a,b,c: my_function(a, b, c, 1, 2, 3)
>>> new_func('a', 'b', 'c')
a b c 1 2 3
Другие вопросы по тегам